Skip to content

test: speed up slow dashboard test suites - #1763

Merged
gsxdsm merged 2 commits into
mainfrom
feature/fix-slow-tests
Jun 25, 2026
Merged

test: speed up slow dashboard test suites#1763
gsxdsm merged 2 commits into
mainfrom
feature/fix-slow-tests

Conversation

@gsxdsm

@gsxdsm gsxdsm commented Jun 25, 2026

Copy link
Copy Markdown
Collaborator

What & why

Cuts feedback-loop wall-time on the slowest dashboard test files (FN-5048 velocity). Profiled the velocity baseline's top offenders; all changes are behavior-preserving — no assertions, timeouts, or worker/concurrency knobs changed.

Changes

File Root cause Fix Result (verified locally)
SettingsModal.test.tsx (#1, ~60.5s) 231 tests in one sequential worker; flat ~250ms/test Split into 4 sibling files sharing SettingsModal.test-harness.tsx; the settings project parallelizes them across workers shard 60.5s → ~25s (−58%)
insights-routes.test.ts (#2, ~26.5s) Double TaskStore.init() per test; only 1 of 24 tests needs the project-b store Lazy-init storeB on first use tests 5.78s → 3.66s (−37%)
evals-routes.test.ts Same double-init pattern Same lazy storeB tests ~0.98s

SettingsModal split mechanics

  • Test bodies moved verbatim — static it() count preserved at 231.
  • vi.mock factories stay in each test file (they only apply per module) and reference the ~61 mock fns imported from the harness.
  • Shared beforeEach/afterEach registered via the harness's exported installSettingsModalEnv().
  • vitest.config.ts: qualityAppSettingsOnlyTests now points at the 4 new files; bare "SettingsModal" dropped from qualityAppComponentTests/isolatedQualityAppComponentTests.

Verification

  • All 4 split files green; independent run: 518 passed / 0 failed (4 files × 2 project collections × 259 assertions). Original profile = 259 assertions / 231 it()s — matches.
  • ESLint exit 0 on all new/changed files; check-test-inventory --dashboard-curated passed.
  • insights-routes 24/24 and evals-routes 7/7 pass.

Notes

  • No changeset (test-only + CI config, behavior-preserving — per AGENTS.md).
  • Stale references to the old filename remain only in generated snapshots (test-timings.json, line-count-baseline.json, test-velocity-history.json); they refresh on the next pnpm test:velocity run.

🤖 Generated with Claude Code


Open in Stage

Summary by CodeRabbit

  • Tests
    • Expanded dashboard settings coverage with focused suites for General, Authentication, Scheduling/Merge, and Remote/Notifications.
    • Added a shared SettingsModal test harness to centralize rendering, readiness, and persistence assertions, improving reliability and maintainability.
    • Updated Evals/Insights route tests to lazily initialize and clean up project-scoped task storage.
    • Adjusted Vitest configuration to isolate the new SettingsModal shards and prevent duplicate execution, keeping test runs faster and cleaner.

Reduce feedback-loop wall-time on the slowest dashboard test files
(FN-5048 velocity), behavior-preserving — no assertions, timeouts, or
worker counts changed.

- SettingsModal.test.tsx (231 tests, ~60.5s in one sequential worker)
  split into 4 sibling files sharing SettingsModal.test-harness.tsx so
  the settings project parallelizes them across workers (~60.5s -> ~25s
  wall). Test bodies moved verbatim; static it() count preserved at 231.
  vi.mock factories stay per-file and reference the harness-exported
  mock fns; shared beforeEach/afterEach via installSettingsModalEnv().
- insights-routes.test.ts: lazily init the project-b store (only 1 of 24
  tests needs it) instead of a second TaskStore.init() per test
  (tests 5.78s -> 3.66s).
- evals-routes.test.ts: same lazy storeB pattern.
- vitest.config.ts: point the settings-only project at the 4 new files;
  drop the bare "SettingsModal" entry from the component shards.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 817c3096-2084-4ff0-b12e-dea820938a52

📥 Commits

Reviewing files that changed from the base of the PR and between 003740d and a1e7602.

📒 Files selected for processing (1)
  • packages/dashboard/vitest.config.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/dashboard/vitest.config.ts

📝 Walkthrough

Walkthrough

This PR adds a shared SettingsModal test harness, splits SettingsModal coverage into multiple sharded Vitest suites, and updates evals/insights route tests to lazily create the project-b task store during scoped cases.

Changes

SettingsModal test coverage and sharding

Layer / File(s) Summary
Shared harness and shard configuration
packages/dashboard/app/components/__tests__/SettingsModal.test-harness.tsx, packages/dashboard/vitest.config.ts
Shared mocks, fixtures, render helpers, environment setup, and Vitest include lists are added for the SettingsModal suites.
Modal shell and global general
packages/dashboard/app/components/__tests__/SettingsModal.general.test.tsx
Mobile keyboard styling, initial section routing, embedded-modal semantics, section aliases, deferred fetch timing, and global general settings persistence are covered.
Project general and appearance
packages/dashboard/app/components/__tests__/SettingsModal.general.test.tsx
Project-scoped general settings, agent approval payloads, GitHub tracking and summarization behavior, repo selection validation, and dashboard font scale persistence are covered.
Models, auth, and plugin tabs
packages/dashboard/app/components/__tests__/SettingsModal.models-auth.test.tsx
Project model sync, workflow lane inheritance and reset behavior, authentication and OAuth/device-code flows, API-key UX, and Plugins tab navigation are covered.
Scheduling, worktrees, memory, and merge sections
packages/dashboard/app/components/__tests__/SettingsModal.scheduling-merge.test.tsx
Overlap ignore paths, worktree and worktrunk settings, memory editor behavior, and merge-section controls that were moved or persisted are covered.
Remote access, notifications, research, and memory dreams
packages/dashboard/app/components/__tests__/SettingsModal.remote-notifications.test.tsx
Remote tunnel flows, notification provider cards, scheduled eval settings, research settings, memory dream trigger behavior, and plugin contribution shape are covered.

Dashboard route test store setup

Layer / File(s) Summary
Lazy project-b store lifecycle
packages/dashboard/src/__tests__/insights-routes.test.ts, packages/dashboard/src/__tests__/evals-routes.test.ts
Lazy project-b store creation, resolver routing, and conditional cleanup are added to the route test suites.
Scoped project-b test callsites
packages/dashboard/src/__tests__/evals-routes.test.ts, packages/dashboard/src/__tests__/insights-routes.test.ts
Scoped eval and insight tests await the lazy store and create project-b data through that instance.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • Runfusion/Fusion#51 — Also changes the SettingsModal Vitest sharding and include/exclude split.
  • Runfusion/Fusion#1445 — Shares the SettingsModal workflow/settings UI area that these tests exercise.
  • Runfusion/Fusion#1700 — Also adjusts dashboard Vitest project grouping for SettingsModal-related test runs.

Poem

I hop through shards by moonlit light,
and sniff out tests both keen and bright.
With tiny paws I tap and save,
then carrot-cheer the code I gave. 🐇

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly matches the main change: speeding up slow dashboard test suites.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/fix-slow-tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@ghost

ghost commented Jun 25, 2026

Copy link
Copy Markdown

Ready to review this PR? Stage has broken it down into 4 individual chapters for you:

Title
1 Optimize route tests with lazy store initialization
2 Establish shared harness for SettingsModal tests
3 Split SettingsModal tests into parallelizable suites
4 Update Vitest configuration for split suites
Open in Stage

Chapters generated by Stage for commit a1e7602 on Jun 25, 2026 6:04pm UTC.

@greptile-apps

greptile-apps Bot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR speeds up the slowest dashboard test suites by splitting the 231-test SettingsModal.test.tsx into four parallel sibling files backed by a shared harness, and applying lazy-init for the storeB fixture in insights-routes and evals-routes to eliminate a redundant TaskStore.init()/migrate per test.

  • SettingsModal split: The monolithic file is replaced with four SettingsModal.*.test.tsx files sharing SettingsModal.test-harness.tsx. Each file re-declares its own vi.mock blocks and delegates to the harness's exported mock functions and installSettingsModalEnv(). The vitest.config.ts moves the four new paths into qualityAppSettingsOnlyTests, spreads that array into backfillAppExclude (fixing the double-run risk from the prior review cycle), and drops the old bare "SettingsModal" entry from qualityAppComponentTests.
  • Lazy storeB init: Both insights-routes.test.ts and evals-routes.test.ts reset storeB/rootB to null in beforeEach and provide a getStoreB() helper that initialises the second store only when called; afterEach cleans up only when it was created.

Confidence Score: 5/5

All changes are test infrastructure only — no production code, assertions, or timeout values are touched.

The split is behavior-preserving: 231 tests moved verbatim into four isolated files; the backfill exclusion that was missing in the prior review cycle is now correctly in place via ...qualityAppSettingsOnlyTests in backfillAppExclude. The lazy-storeB pattern is correctly guarded in both beforeEach and afterEach. No assertions, timeouts, or worker knobs were changed.

No files require special attention.

Important Files Changed

Filename Overview
packages/dashboard/vitest.config.ts Added qualityAppSettingsOnlyTests (4 new paths) for the new dashboard-app-quality-settings project, explicitly spread into backfillAppExclude to prevent double-runs. Partition invariant is correctly maintained.
packages/dashboard/app/components/tests/SettingsModal.test-harness.tsx New shared harness exporting 61 vi.fn() mock instances and installSettingsModalEnv() hooks. Module-level mocks give each isolated worker its own instances; vi.resetAllMocks() ensures per-test isolation.
packages/dashboard/app/components/tests/SettingsModal.general.test.tsx New split file covering general, embedded-presentation, and navigation tests with correct vi.mock re-declarations and harness wiring.
packages/dashboard/app/components/tests/SettingsModal.models-auth.test.tsx New split file covering model/provider selection and authentication flows; correct harness usage.
packages/dashboard/app/components/tests/SettingsModal.remote-notifications.test.tsx New split file covering remote-access tunnel and notification settings; correct harness usage.
packages/dashboard/app/components/tests/SettingsModal.scheduling-merge.test.tsx New split file covering scheduling, worktrees, memory, and merge settings; correct harness usage.
packages/dashboard/src/tests/insights-routes.test.ts Replaced eager storeB init with a lazy getStoreB() helper; afterEach only closes/removes storeB when it was actually created.
packages/dashboard/src/tests/evals-routes.test.ts Same lazy-storeB pattern as insights-routes. Only two of seven tests call getStoreB(), so five tests skip the second SQLite migration. Cleanup is correctly guarded.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    subgraph Before
        OldFile[SettingsModal.test.tsx 231 tests 1 worker]
    end
    subgraph After
        Harness[SettingsModal.test-harness.tsx]
        F1[SettingsModal.general.test.tsx]
        F2[SettingsModal.models-auth.test.tsx]
        F3[SettingsModal.scheduling-merge.test.tsx]
        F4[SettingsModal.remote-notifications.test.tsx]
        Harness --> F1
        Harness --> F2
        Harness --> F3
        Harness --> F4
    end
    subgraph Config
        Settings[dashboard-app-quality-settings]
        Backfill[dashboard-app-quality-backfill excludes all 4 files]
        F1 & F2 & F3 & F4 --> Settings
        F1 & F2 & F3 & F4 -.->|excluded| Backfill
    end
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
    subgraph Before
        OldFile[SettingsModal.test.tsx 231 tests 1 worker]
    end
    subgraph After
        Harness[SettingsModal.test-harness.tsx]
        F1[SettingsModal.general.test.tsx]
        F2[SettingsModal.models-auth.test.tsx]
        F3[SettingsModal.scheduling-merge.test.tsx]
        F4[SettingsModal.remote-notifications.test.tsx]
        Harness --> F1
        Harness --> F2
        Harness --> F3
        Harness --> F4
    end
    subgraph Config
        Settings[dashboard-app-quality-settings]
        Backfill[dashboard-app-quality-backfill excludes all 4 files]
        F1 & F2 & F3 & F4 --> Settings
        F1 & F2 & F3 & F4 -.->|excluded| Backfill
    end
Loading

Reviews (2): Last reviewed commit: "Address PR review feedback (#1763)" | Re-trigger Greptile

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/dashboard/app/components/__tests__/SettingsModal.general.test.tsx`:
- Around line 694-721: The test file uses PersistSettingInput in the it.each
call but never imports it, causing a TypeScript error; add the missing type
import from SettingsModal.test-harness alongside the existing test harness
imports so the SettingsModal.general.test.tsx suite compiles cleanly.

In `@packages/dashboard/src/__tests__/evals-routes.test.ts`:
- Around line 38-46: Make getStoreB() return and reuse a shared initialization
promise so concurrent project-b lookups cannot observe storeB before init
completes. Update the helper around getStoreB and the related project-b test
setup so the first call creates the store and stores the init promise, and
subsequent calls await that same promise before returning the TaskStoreClass
instance.

In `@packages/dashboard/src/__tests__/insights-routes.test.ts`:
- Around line 89-97: Serialize the lazy initialization in getStoreB so
concurrent calls cannot observe a partially initialized TaskStore: instead of
assigning storeB before await storeB.init() completes, add a pending creation
promise in the test helper and have getStoreB dedupe and await that promise
until initialization finishes. Keep the behavior aligned with
getOrCreateProjectStore and update the affected assertions around getStoreB so
the mock matches the production contract for concurrent project-scoped requests.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 83c37df9-4e7b-45c1-9412-4d4936590bc7

📥 Commits

Reviewing files that changed from the base of the PR and between 9a46b7a and 003740d.

📒 Files selected for processing (9)
  • packages/dashboard/app/components/__tests__/SettingsModal.general.test.tsx
  • packages/dashboard/app/components/__tests__/SettingsModal.models-auth.test.tsx
  • packages/dashboard/app/components/__tests__/SettingsModal.remote-notifications.test.tsx
  • packages/dashboard/app/components/__tests__/SettingsModal.scheduling-merge.test.tsx
  • packages/dashboard/app/components/__tests__/SettingsModal.test-harness.tsx
  • packages/dashboard/app/components/__tests__/SettingsModal.test.tsx
  • packages/dashboard/src/__tests__/evals-routes.test.ts
  • packages/dashboard/src/__tests__/insights-routes.test.ts
  • packages/dashboard/vitest.config.ts

Comment on lines +694 to +721
it.each<PersistSettingInput>([
{
section: "Project General",
label: "Completion Documentation Automation",
kind: "select",
value: "changeset",
scope: "project",
expectedKey: "completionDocumentationMode",
},
{
section: "Project General",
label: "Auto-cleanup old chats",
kind: "select",
value: 14,
scope: "project",
expectedKey: "chatAutoCleanupDays",
},
{
section: "Project General",
label: "Operational log retention",
kind: "select",
value: 7,
scope: "project",
expectedKey: "operationalLogRetentionDays",
},
])("persists $expectedKey through the expected settings scope", async (input) => {
await expectSettingPersists(input);
});

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.

🎯 Functional Correctness | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Confirm PersistSettingInput is exported from the harness but not imported in the test file.
fd 'SettingsModal.test-harness.tsx' --exec rg -n 'export type PersistSettingInput' {}
fd 'SettingsModal.general.test.tsx' --exec rg -n 'PersistSettingInput' {}

Repository: Runfusion/Fusion

Length of output: 233


PersistSettingInput is referenced but never imported.

The type PersistSettingInput is used at line 694 but is not imported in this file, causing a TypeScript compilation error. It is exported from SettingsModal.test-harness.

🐛 Add the missing type import
   expectSettingPersists,
+  type PersistSettingInput,
   installSettingsModalEnv,
 } from "./SettingsModal.test-harness";
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/dashboard/app/components/__tests__/SettingsModal.general.test.tsx`
around lines 694 - 721, The test file uses PersistSettingInput in the it.each
call but never imports it, causing a TypeScript error; add the missing type
import from SettingsModal.test-harness alongside the existing test harness
imports so the SettingsModal.general.test.tsx suite compiles cleanly.

Comment on lines +38 to +46
let rootB: string | null = null;
let storeB: TaskStore | null = null;
async function getStoreB(): Promise<TaskStore> {
if (!storeB) {
rootB = mkdtempSync(join(tmpdir(), "kb-evals-routes-b-"));
storeB = new TaskStoreClass(rootB, join(rootB, ".fusion-global-settings"), { inMemoryDb: true });
await storeB.init();
}
return storeB;

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.

🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Make getStoreB() return the shared init promise.

Line 41 makes storeB visible before await storeB.init() completes, so concurrent project-b lookups can observe an uninitialized store. That differs from the real resolver behavior, which deduplicates creation and resolves only after initialization finishes.

Suggested fix
 let rootB: string | null = null;
 let storeB: TaskStore | null = null;
+let storeBInit: Promise<TaskStore> | null = null;
 async function getStoreB(): Promise<TaskStore> {
-  if (!storeB) {
+  if (!storeBInit) {
     rootB = mkdtempSync(join(tmpdir(), "kb-evals-routes-b-"));
     storeB = new TaskStoreClass(rootB, join(rootB, ".fusion-global-settings"), { inMemoryDb: true });
-    await storeB.init();
+    storeBInit = storeB.init().then(() => storeB!);
   }
-  return storeB;
+  return storeBInit;
 }
-    rootB = null;
-    storeB = null;
+    rootB = null;
+    storeB = null;
+    storeBInit = null;

Also applies to: 52-53

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/dashboard/src/__tests__/evals-routes.test.ts` around lines 38 - 46,
Make getStoreB() return and reuse a shared initialization promise so concurrent
project-b lookups cannot observe storeB before init completes. Update the helper
around getStoreB and the related project-b test setup so the first call creates
the store and stores the init promise, and subsequent calls await that same
promise before returning the TaskStoreClass instance.

Comment on lines +89 to +97
let rootB: string | null = null;
let storeB: TaskStore | null = null;
async function getStoreB(): Promise<TaskStore> {
if (!storeB) {
rootB = mkdtempSync(join(tmpdir(), "kb-insights-routes-b-"));
storeB = new TaskStoreClass(rootB, join(rootB, ".fusion-global-settings"), { inMemoryDb: true });
await storeB.init();
}
return storeB;

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.

🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Serialize the lazy store initialization.

Line 92 assigns storeB before init() finishes, so a second concurrent getStoreB() call can resolve with a half-initialized store. The real getOrCreateProjectStore() path deduplicates the pending creation promise, so this mock no longer matches the production contract for concurrent project-scoped requests.

Suggested fix
 let rootB: string | null = null;
 let storeB: TaskStore | null = null;
+let storeBInit: Promise<TaskStore> | null = null;
 async function getStoreB(): Promise<TaskStore> {
-  if (!storeB) {
+  if (!storeBInit) {
     rootB = mkdtempSync(join(tmpdir(), "kb-insights-routes-b-"));
     storeB = new TaskStoreClass(rootB, join(rootB, ".fusion-global-settings"), { inMemoryDb: true });
-    await storeB.init();
+    storeBInit = storeB.init().then(() => storeB!);
   }
-  return storeB;
+  return storeBInit;
 }
-    rootB = null;
-    storeB = null;
+    rootB = null;
+    storeB = null;
+    storeBInit = null;

Also applies to: 120-121

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/dashboard/src/__tests__/insights-routes.test.ts` around lines 89 -
97, Serialize the lazy initialization in getStoreB so concurrent calls cannot
observe a partially initialized TaskStore: instead of assigning storeB before
await storeB.init() completes, add a pending creation promise in the test helper
and have getStoreB dedupe and await that promise until initialization finishes.
Keep the behavior aligned with getOrCreateProjectStore and update the affected
assertions around getStoreB so the mock matches the production contract for
concurrent project-scoped requests.

- Exclude the 4 SettingsModal split files from the app backfill project
  (greptile P1): the split dropped the bare "SettingsModal" entry from
  qualityAppComponentTests, which had excluded the curated file from
  backfill; without spreading qualityAppSettingsOnlyTests into
  backfillAppExclude the split files matched the backfill `app/**` glob
  and ran in two projects, doubling their wall-time. Now collected by
  exactly one project (dashboard-app-quality-settings).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@gsxdsm

gsxdsm commented Jun 25, 2026

Copy link
Copy Markdown
Collaborator Author

Settings test files will double-run in the backfill projectqualityAppSettingsOnlyTests is not added to backfillAppExclude, so all four new SettingsModal.*.test.tsx files match the backfill project's app/**/*.test.{ts,tsx} glob ... They will run in both dashboard-app-quality-settings and dashboard-app-quality-backfill, doubling rather than halving the work. (@greptile-apps)

Addressed in a1e7602: spread ...qualityAppSettingsOnlyTests into backfillAppExclude (with a FNXC comment explaining why the split removed the partition guarantee). Good catch — this directly worked against the PR's goal.

Verified with vitest list --filesOnly: each of the 4 split files is now collected by exactly one project (dashboard-app-quality-settings), and dashboard-test-config-guard.test.ts passes (5/5).

@greptile-apps

greptile-apps Bot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

The fix in a1e7602 is exactly right — spreading ...qualityAppSettingsOnlyTests into backfillAppExclude restores the partition guarantee that the original bare "SettingsModal" string entry previously provided. The vitest list and guard-test verification confirm it's working. Issue resolved.

Tip: You can customize Greptile's behavior for this repo with .greptile/rules.md and .greptile/config.json.

@gsxdsm
gsxdsm merged commit 425a94e into main Jun 25, 2026
6 checks passed
@gsxdsm
gsxdsm deleted the feature/fix-slow-tests branch June 25, 2026 18:20
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.

1 participant