Skip to content

Leave pending-delete rows out of the selected-reports check - #100513

Open
MelvinBot wants to merge 5 commits into
mainfrom
claude-mergeReportsOfflineDelete
Open

MelvinBot wants to merge 5 commits into
mainfrom
claude-mergeReportsOfflineDelete

Conversation

@MelvinBot

@MelvinBot MelvinBot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Explanation of Change

Why this is the cause, and not a stale search snapshot

The first hypothesis was that the offline optimistic delete leaves a stale transaction count or total in the search snapshot. That is not what happens:

  • canMergeReports and isMoneyRequestReportEligibleForMerge never read total, nonReimbursableTotal, transactionCount, or any transaction list.
  • The offline delete writes no snapshot keys at all — DeleteMoneyRequest.ts only touches TRANSACTION, TRANSACTION_VIOLATIONS, REPORT, and REPORT_ACTIONS.

The divergence is in the selection layer, which is what this PR changes. This also explains the "only appears after opening the report" half of the report: once the deleted transaction leaves the row's transaction list, the old every() check passes again and the option returns.

Related observations, deliberately left out of scope

Two things noticed while tracing this that are not changed here, to keep the deploy-blocker fix minimal:

  1. useSearchBulkActions.ts:2433 hard-disables Merge reports whenever areAllMatchingItemsSelected is set, so selecting via the header select-all also hides it. That may well be intentional, since an "all matching" selection is unbounded.
  2. The same gate reads currentSearchResults directly rather than the searchResults fallback used elsewhere in that hook.

Worth a follow-up decision, but neither is required to unblock the deploy.

Fixed Issues

$ #100502
PROPOSAL: #100502 (comment)

AI Tests

Run by MelvinBot on this branch. This section records automated checks only — it is not a substitute for the human Tests and QA Steps sections below.

Check Result
npm test -- --silent tests/unit/Search tests/ui/GroupHeaderTest.tsx ✅ 50 suites, 1513 tests passed
npm run typecheck ✅ passed
npm run lint-changed ✅ passed
npm run spell-changed ✅ 2 files, 0 issues
Browser verification of the fix ❌ could not run — see below

The new unit tests were confirmed to actually catch the bug: with the one-line source change reverted, 3 of the 6 cases in deriveSelectedReportsTest.ts fail; with it applied, all 6 pass.

Not verified in a browser. The attempt to drive the offline repro against this branch was blocked by an unrelated environment failure — the test session's page rendered blank (0 accessibility nodes, no network activity) for the whole run, while the dev server itself compiled cleanly. The behavioural fix therefore rests on unit-test and code evidence, not on a live run. The original bug was reproduced live on main before this change (evidence), so the repro steps are known-good and worth re-running by hand.

npm run lint, npm test (full suite), and npm run storybook -- --smoke-test --ci were not run — the Search suites above cover every consumer of the changed function, and no component or story was touched.

Tests

  1. Log into newdot with an expensify/expensifail account
  2. Go to workspace chat.
  3. Create a report with two expenses.
  4. Create another report with one expense.
  5. Go offline.
  6. Open the report with two expenses and delete one of the expenses.
  7. Go to Spend > Reports.
  8. Bulk select both expenses.
  9. Click dropdown button.
  10. Confirm merge reports option is not shown.

Expected Result:

In Step 9, Merge reports option will be shown when selecting both reports with same status.

  • Verify that no errors appear in the JS console

Offline tests

None

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.
  • 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

A report whose rows are selected via the group checkbox never gets a
selection entry for a row queued for deletion, so requiring every row to
be selected dropped the report from selectedReports. That hid bulk
actions gated on the report count -- Merge reports among them -- after an
offline expense delete.

Derive the check from the selectable rows instead, matching getGroupCheckboxState.

Co-authored-by: Alberto Gonzalez-Cela <Gonals@users.noreply.github.com>
@MelvinBot
MelvinBot requested a review from a team September 7, 2026 13:02
@melvin-bot melvin-bot Bot added Melvin-Test-Android Melvin-Test-Web Triggers Melvin to run the testing steps of the PR on web labels Sep 7, 2026
@MelvinBot

Copy link
Copy Markdown
Contributor Author

⚠️ A setup step failed before I could start. This is usually a temporary issue — try again in a few minutes, and if it persists post in #melvinbot-ai.

Run details

@MelvinBot

MelvinBot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor Author

🤖 Web test steps verification results: ✅ pass

On dev NewDot web, after deleting one expense from a 2-expense report while offline, selecting both draft reports in Spend > Reports still shows Merge reports in the bulk-action dropdown, and it correctly disappears when only one report is selected — confirming the fix.

Bulk-action dropdown without Merge reports when only 1 report is selected

Step Status
Create a report with two expenses in a workspace chatCreated a workspace and, in its expense chat, an "Expense Report 2026-09-07" containing Coffee Shop ($10.00) and Taxi Ride ($25.00), total $35.00.
Second report with Lunch Place expense, first report visible in list
Create a second report with one expenseA second "Expense Report 2026-09-07" was created in the same workspace chat with a single Lunch Place ($15.00) expense.
Second (one-expense) report shown in the workspace chat
Go offlineEnabled Account > Preferences > Troubleshoot > "Force offline"; the app status bar showed "You appear to be offline."
Force offline toggle enabled with offline status banner
Open the two-expense report and delete one expense (shows as pending delete)Selected the Taxi Ride row and deleted it via the bulk-action "Delete" + confirmation. The row stayed visible with strikethrough text ($25.00 struck through) and the report total updated to $10.00 while offline.
Taxi Ride expense shown struck-through as pending delete
Go to Spend > Reports and bulk-select both reportsIn Spend > Reports, checked both report row checkboxes; header showed "2 selected" with both row checkboxes checked (rows for the $15.00 and $10.00 reports).
Both report rows selected, 2 selected shown
Open the dropdown and verify Merge reports IS shownDropdown for "2 selected" listed: Merge reports, Export, Download as PDF, Duplicate reports, Delete — Merge reports is present despite the report holding the pending-delete row.
Bulk-action dropdown showing Merge reports option with 2 reports selected
Select only one report and verify Merge reports is NOT shownUnchecked the $10.00 report, leaving "1 selected". The dropdown then listed only: Export, Download as PDF, Split, Duplicate report, Delete — no Merge reports.
Only one report selected (1 selected)
Bulk-action dropdown without Merge reports when only 1 report is selected
Verify that no errors appearThe web harness has no direct browser-console inspection, so this was checked via the network dump (all ~60 recent requests returned 200, no failed responses) and via full-page snapshots throughout the flow, which never showed a RedBox, error banner, or crash screen. A literal JS console check still needs a human pass.

view run · no recording available

@Gonals
Gonals marked this pull request as ready for review September 9, 2026 13:45
@Gonals
Gonals requested a review from a team as a code owner September 9, 2026 13:46
@melvin-bot
melvin-bot Bot requested review from a team, dmkt9, dylanexpensify and situchan and removed request for a team September 9, 2026 13:46
@melvin-bot

melvin-bot Bot commented Sep 9, 2026

Copy link
Copy Markdown

@situchan @dmkt9 One of you needs to copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button]

@melvin-bot
melvin-bot Bot requested review from joekaufmanexpensify and removed request for a team September 9, 2026 13:46
@MelvinBot

MelvinBot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor Author

Nothing to fix — every code check passes. The one failing check just needs a human approval.

Check independent approval fails with:

Expensify/App#100513 does not have enough independent eligible reviewer approvals.
  approvers: [],
  independentApprovers: [],

The PR has zero reviews so far (dmkt9, situchan, dylanexpensify, joekaufmanexpensify are requested). This check passes once an eligible reviewer approves — no code change can make it green, so I haven't pushed anything.

Full check status

All other checks on the latest run are green, including the ones most likely to catch a problem with this change:

Check Result
test (jobs 1–8) ✅ pass
typecheck ✅ pass
ESLint check ✅ pass
Oxfmt check ✅ pass
Storybook tests ✅ pass
Bun tests ✅ pass
spellcheck ✅ pass
Compare knip issues against main ✅ pass
Check for unused styles ✅ pass
React Compiler Compliance ✅ pass
baseline-perf-tests / branch-perf-tests ✅ pass
build (developmentDebug, false) — Android ✅ pass
build (New Expensify Dev, DebugDevelopment, false) — iOS ✅ pass
codecov/patch, codecov/project ✅ pass

An earlier run also failed PR Author Checklist, but that one is green on the current commit.

One unrelated thing worth correcting while you're in here: the Tests section contradicts itself. Step 10 says "Confirm merge reports option is not shown", but the Expected Result right below says the option will be shown. The fix restores the option, so step 10 is the wrong one.


view run · view recording

dylanexpensify
dylanexpensify previously approved these changes Sep 9, 2026

@dylanexpensify dylanexpensify left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Steps make sense, looks good from a product pov

@joekaufmanexpensify
joekaufmanexpensify removed their request for review September 9, 2026 17:16
@Gonals

Gonals commented Sep 15, 2026

Copy link
Copy Markdown
Contributor

bump @situchan @dmkt9

@Gonals
Gonals requested a review from a team as a code owner September 15, 2026 11:01
@melvin-bot
melvin-bot Bot requested a review from Gonals September 15, 2026 11:01
@melvin-bot

melvin-bot Bot commented Sep 15, 2026

Copy link
Copy Markdown

@Gonals Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button]

@melvin-bot
melvin-bot Bot removed the request for review from a team September 15, 2026 11:01
@situchan

Copy link
Copy Markdown
Contributor

Reviewer Checklist

  • I have verified the author checklist is complete (all boxes are checked off).
  • I verified the correct issue is linked in the ### Fixed Issues section above
  • I verified testing steps are clear and they cover the changes made in this PR
    • I verified the steps for local testing are in the Tests section
    • I verified the steps for Staging and/or Production testing are in the QA steps section
    • I verified the steps cover any possible 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 checked that screenshots or videos are included for tests on all platforms
  • I included screenshots or videos for tests on all platforms
  • I verified that the composer does not automatically focus or open the keyboard on mobile unless explicitly intended. This includes checking that returning the app from the background does not unexpectedly open the keyboard.
  • I verified tests pass on all platforms & I tested again on:
    • Android: HybridApp
    • Android: mWeb Chrome
    • iOS: HybridApp
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
  • If there are any errors in the console that are unrelated to this PR, I either fixed them (preferred) or linked to where I reported them in Slack
  • I verified proper code patterns were followed (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 verified that this PR follows the guidelines as stated in the Review Guidelines
  • I verified other components that can be impacted by these changes have been tested, and I retested again (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar have been tested & I retested again)
  • If a new component is created I verified that:
    • A similar component doesn't exist in the codebase
    • All props are defined accurately
    • The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
    • The only data being stored in the state is data necessary for rendering and nothing else
    • The component has the minimum amount of code necessary for its purpose, and it is broken down into smaller components in order to separate concerns and functions
  • 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 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.
  • For any bug fix or new feature in this PR, I verified that sufficient unit tests are included to prevent regressions in this 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.
  • I have checked off every checkbox in the PR reviewer checklist, including those that don't apply to this PR.

Screenshots/Videos

Android: HybridApp
Android: mWeb Chrome
iOS: HybridApp
iOS: mWeb Safari
MacOS: Chrome / Safari

Co-authored-by: Alberto Gonzalez-Cela <Gonals@users.noreply.github.com>
@MelvinBot

Copy link
Copy Markdown
Contributor Author

Fixed and pushed in 460ec04.

What was failing: only typecheck. The main merge into this branch made displayAmount a required field on SelectedTransactionInfo (src/components/Search/types.ts:76), and the new test fixture added by this PR didn't set it:

tests/unit/Search/deriveSelectedReportsTest.ts(39,9): error TS2741:
Property 'displayAmount' is missing in type '{ ... }' but required in type 'SelectedTransactionInfo'.

The fix: added displayAmount: 100 to the fixture, matching what the sibling tests already do (tests/unit/Search/useSyncSelectedReportsTest.tsx:57). One added line, test-only — no source or behaviour change.

Verification
Check Result
npm run typecheck ✅ passed (all 5 tsconfigs)
npm test -- --silent tests/unit/Search tests/unit/hooks/useSearchBulkActionsTest.ts ✅ 53 suites, 1647 tests passed
npx eslint tests/unit/Search/deriveSelectedReportsTest.ts ✅ passed

npm run lint-changed and npm run spell-changed both aborted before running with git merge-base failed — an environment issue with the shallow checkout, not a code failure. The lint gate was covered by running eslint on the changed file directly. Spellcheck and Oxfmt add no new risk here: the one added token, displayAmount, is an existing identifier copied verbatim from a sibling test, and both checks were already passing on this branch.

The two *-perf-tests checks were still pending when I looked, and everything else was already green.

@MelvinBot

Copy link
Copy Markdown
Contributor Author

The remaining failures are not from this PR — main is broken. I'm not pushing anything this time.

Expensify/App#100881 merged to main at 11:04 UTC today and left a duplicate variable declaration in src/pages/inbox/sidebar/InboxTabSelector.tsxconst {shouldUseNarrowLayout} = useResponsiveLayout(); appears at both L40 and L47 of the same function. That file is not in this PR's diff (this PR touches only selectionBuilders.ts and deriveSelectedReportsTest.ts), and CI builds the PR merged with main, so this branch inherits the breakage.

It accounts for every real failure:

Check Cause
typecheck TS2451: Cannot redeclare block-scoped variable 'shouldUseNarrowLayout' at InboxTabSelector.tsx(40,12) and (47,12)
test (job 4), (job 7), (job 8) Babel SyntaxError: Identifier 'shouldUseNarrowLayout' has already been declared. (47:11) — the failing suites (PaginationTest, UnreadIndicatorsTest, GroupChatNameTests, SessionTest) all render the sidebar, which imports that file

checklist and Check independent approval are expected on a bot-authored PR and aren't code problems. ESLint check and the two *-perf-tests jobs were still running.

What needs to happen: someone has to fix or revert Expensify/App#100881 on main. As of now there's no revert PR or tracking issue open for it, and main still has the duplicate at ad2bdf1. Once that lands, re-run these checks here — no change is needed on this branch. Fixing it inside this PR would mean shipping an unrelated main fix in a deploy-blocker PR, so I've left it alone.

Status of the earlier fix

The displayAmount typecheck error I fixed in 460ec04 is gone — it no longer appears in the current typecheck output, which now reports only the two InboxTabSelector.tsx errors. That fix is confirmed good.

@MelvinBot

Copy link
Copy Markdown
Contributor Author

The failing checks are not caused by this PR — main is broken. Nothing to push here.

#100881 merged to main at 11:04 UTC and left a duplicate variable declaration in InboxTabSelector.tsx. shouldUseNarrowLayout is destructured twice in the same function body, at line 40 and line 47 — exactly the two lines the compiler names:

src/pages/inbox/sidebar/InboxTabSelector.tsx(40,12): error TS2451: Cannot redeclare block-scoped variable 'shouldUseNarrowLayout'.
src/pages/inbox/sidebar/InboxTabSelector.tsx(47,12): error TS2451: Cannot redeclare block-scoped variable 'shouldUseNarrowLayout'.

The fix belongs on main, not on this branch: delete the redundant declaration on line 47 (line 40 already provides it), or revert #100881. shawnborton authored it. No fix or revert PR is open yet, so every open PR is currently blocked.

Why this is main and not this PR — evidence

This PR changes two files: src/components/Search/selectionBuilders.ts and tests/unit/Search/deriveSelectedReportsTest.ts. InboxTabSelector.tsx is not among them, and neither is anything the four failing test suites touch.

  1. The file is clean at this PR's head. At 460ec04, grep finds one shouldUseNarrowLayout destructure. On origin/main (ad2bdf1) it finds two.
  2. CI tests the PR merged into main. The pull_request event builds the merge commit, which is how a breakage the branch never contained shows up in this PR's checks.
  3. The same four suites fail on an unrelated branch. refactor-02/66378 fails tests/ui/PaginationTest.tsx, tests/ui/UnreadIndicatorsTest.tsx, tests/ui/GroupChatNameTests.tsx, and tests/ui/SessionTest.tsx in the same jobs 4, 7, and 8 (run). Several other branches began failing right after the 11:04 merge.
  4. The tests pass locally on this branch alone. npm test -- --silent tests/ui/PaginationTest.tsx → 3 passed. The duplicate declaration throws when the module is evaluated, so the sidebar never renders, which is why these LHN tests report Unable to find an element with testID: 1 rather than a syntax error.

checklist and Check independent approval also show red; both are the usual human-gate checks, not code failures.

The displayAmount typecheck failure I fixed in 460ec04 is resolved — it no longer appears in the latest run, which reports only the InboxTabSelector errors. Once main is fixed, this PR should go green on a re-run without further changes.

@MelvinBot

Copy link
Copy Markdown
Contributor Author

Nothing left to fix on this PR — main is broken. Every remaining failure comes from a duplicate variable declaration in src/pages/inbox/sidebar/InboxTabSelector.tsx:40-47, a file this PR never touches:

src/pages/inbox/sidebar/InboxTabSelector.tsx(47,12): error TS2451: Cannot redeclare block-scoped variable 'shouldUseNarrowLayout'.

const {shouldUseNarrowLayout} = useResponsiveLayout(); appears twice in the same function body, so the file fails to parse. That one error accounts for all four non-ignorable failing checks: typecheck, ESLint check, and test jobs 4, 7, and 8.

A fix is already open: #101195. Once it merges, re-run the checks here — no change to this branch is needed.

The typecheck failure I fixed earlier (460ec04) is resolved; it no longer appears in the log.

How I confirmed it's main and not this PR

The bad line is on main, not on this branch. The branch head is 460ec04 — my displayAmount commit — with no newer merge. The duplicate exists at origin/main (c85bcf4). CI runs the PR head merged into base, so this branch inherits it.

It came from a silent bad merge, not from either side's code. The merge commit ad2bdf1 (merge of #100881) has two declarations, but each of its parents has exactly one:

Commit Declarations
50b3c85 (base parent) 1, at line 40
fa1af59 (branch parent) 1, at line 42
ad2bdf1 (the merge) 2, at lines 40 and 47

Both sides added the same line at slightly different offsets, so Git kept both without reporting a conflict.

The failing tests are all sidebar-rendering UI tests, none of them Search: tests/ui/PaginationTest.tsx, tests/ui/UnreadIndicatorsTest.tsx, tests/ui/GroupChatNameTests.tsx, tests/ui/SessionTest.tsx. Each fails with the same Babel parse error on that file. This PR's own suite passes — I ran npm test -- --silent tests/unit/Search tests/unit/hooks/useSearchBulkActionsTest.ts locally at 460ec04: 53 suites, 1647 tests passed, and npm run typecheck passed cleanly.

Check independent approval and checklist are also red, but those are the standard human-gated checks, not code failures.

I did not push anything, since fixing an unrelated file from this branch would mix a main repair into a deploy-blocker PR.

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

Labels

Melvin-Test-Android Melvin-Test-Web Triggers Melvin to run the testing steps of the PR on web

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants