Which tests fail most, and which take longest

Two rankings of the propflowai unit tests, both read from CI's own logs: what turned main red this past week, and how long each test file takes on average.

Measured Oct 1, 2026 · 656 failed CI runs, Sep 23 – Oct 1 · 25 full-suite runs on Oct 1 · companion to CI/CD architecture and CI Factory

Failures are mostly one break that stays red for hours, not flaky tests. 70 of the 82 failing test files broke main exactly once and failed every run until someone fixed it. Only 12 files broke main more than once, and four of those check live ElevenLabs settings. Time is spread out: the slowest 10 files are 12% of test time, and 6,830 of 7,585 files finish in under a second.

Failed most (runs, Sep 23 – Oct 1)

FileRunsBreaks
collections-chase-activity.test.ts71once
send-leasing-team-tour-update.test.ts70once
onboarding-wizard-steps.test.tsx70once
workspace-loading-shell-status-marker.test.tsx70once
renewal-ntv-email-regression.test.ts61once

Slowest files (average)

FileAverage
appfolio-client.test.ts67.7s
household-matrix.test.ts44.9s
mutation-control-invocation.test.ts43.9s
guards-for-paths.test.ts43.1s
review-verdict-watchdog-pages-surgically.test.ts42.8s

Broke main more than once (the real flaky-test candidates): user-route-inventory.drift.test.ts ×6, specialist-prompt-drift.test.ts ×5, live-agent-roster.drift.test.ts ×4, specialist-transfers-drift.test.ts ×3, renewal-letter-mms-retry-route.test.ts ×3.

Open a section below for the full rankings. Each fix is a row on the Test Speed Tracker.

1 · Which tests fail most — all 82 files, and the 12 to quarantine

Fede's page lists a flaky-test ranking as "done, list in session". That list was never published, so this page rebuilds it from the logs. It is consistent with his 34-run sample: drift pins, led by the route inventory, are the repeat offenders here too, and maintenance-comms-activities from his list shows up here as well.

656
failed CI runs (main 540, queue 109, nightly 7)
412
named a failing unit test; the other 244 failed some other check (or a test job died without naming a test)
82
test files failed at least once
12
files broke main more than once

How to read the count. Main runs CI on every merge, about 180 times a day. When a test breaks on main it fails every run until a fix lands. So "failed 70 times" usually means "stayed broken for 4 hours", not "fails at random". The last column shows which kind it is. A one break needs a faster fix-forward. A repeat is a quarantine candidate.

#Test file · test that failed mostFailed runsRed forFirst seenSuggestion
1src/__tests__/collections-chase-activity.test.tssendCollectionsChase — legality gate (ADR-0117 deterministic half) > route-to-human (REAL property) with NO existing conversation: creates the thread, then esca71one break 3.9 h, onceSep 30Fix forward faster
2src/__tests__/send-leasing-team-tour-update.test.tssendLeasingTeamTourUpdate — the text leg > someone opted in → email AND a text to them, with the tour reference70one break 4.2 h, onceSep 30Fix forward faster
3src/__tests__/onboarding-wizard-steps.test.tsxthe wizard route list > keeps the steps Fede kept70one break 4.2 h, onceSep 30Fix forward faster
4src/__tests__/workspace-loading-shell-status-marker.test.tsxevery workspace route loading shell carries role="status" (p11-x-skeleton-everywhere) > src/app/(workspace)/onboarding-guide/leasing/hours-contact/loading.tsx r70one break 4.2 h, onceSep 30Fix forward faster
5src/__tests__/renewal-ntv-email-regression.test.tstenant NTV email is recorded on the renewal thread > 🔴 month-to-month + a date written in words + stopped for review → fires the firm notice AND lands the email61one break 3.3 h, onceSep 30Fix forward faster
6agents/clara/lib/messaging/__tests__/handle-tenant-email-capture.test.tshandleTenantEmailCapture > appends both the inbound text and the outbound ack through the conversation-writer machinery61one break 3.3 h, onceSep 30Fix forward faster
7src/__tests__/message-blocked-draft-marker.test.tsagent-loop sweep — no guard can park a draft without the marker > anomaly_review_gate parks its draft through the shared seam61one break 3.3 h, onceSep 30Fix forward faster
8src/__tests__/user-route-inventory.drift.test.tsuser-route inventory — the pin matches the tree > MUTATION CONTROL: a route that gains a raw company equality is SCOPE moved and MISREAD51repeat 6 separate breaks over 7.1 daysSep 23Auto-update pinThe hand-kept route pin goes stale when routes are added; the mutation control also edits the real collections route by string-match and needs it pinned 'selection'. Fix: Generate the pin from a script, and run the mutation control on a fixture route instead of a real one.
9src/lib/domain/escalation/__tests__/escalation-owner-readers.drift.test.tsescalation.owner readers · the real tree > matches the pin EXACTLY — no unpinned reader, no stale pin, no count moved50one break 2.6 h, onceSep 30Fix forward faster
10src/__tests__/apply-tour-intent-slot-hold.test.tsthe slot hold at applyTourIntent (listed buildings only) > CONFIRM of a tour that already has an event does not book the slot when the provider write did not la39one break 2.0 h, onceSep 30Fix forward faster
11src/__tests__/entity-conversation-routes.test.tsxwork order — /maintenance/work-orders/[displayId]/conversation > offers NO copy-link when the thread has no person, rather than a url built from undefined32repeat 2 separate breaks over 3.6 daysSep 24KeepNot a flake: a module-level 30s memo cache (#13169) leaked between tests, and #13168 changed firstChunk; shard debounce-skips hid the red. Fix: Reset every module-level TtlCache memo in a global vitest setup, and run full shards for route changes.
12src/__tests__/live-agent-roster.drift.test.tslive-agent roster — live ElevenLabs vs this repo > every live agent is declared by the repo or listed as expected-unmanaged28repeat 4 separate breaks over 3.0 daysSep 26Move to nightlyCalls the live ElevenLabs API and fails whenever a throwaway agent is left in the workspace or a declared agent is deleted. Those are drifts no PR makes. Fix: Run the live roster comparison nightly with an alert; keep only the no-network shape describe in the merge gate.
13src/lib/domain/portfolio/knowledge/__tests__/effective-sections.test.tsnobody bypasses the door — the one-hop guard, under a title it can keep > no module outside this directory names it — every reader goes through the door28one break 1.1 h, onceSep 30Fix forward faster
14src/__tests__/process-inbound-message-zillow-thread-reply.test.tsD11: a renter reply inside a Zillow thread keeps its forwarding address as the prospect address > [CONTROL] a shared aggregator mailbox is never the prospect ad26one break 1.1 h, onceOct 1Fix forward faster
15src/__tests__/active-thread-invariant.test.tsactive-thread invariant — the Jasper Mockley drop (2026-08-02) > [CONTROL] the same aggregator lead with NO open thread still parks26one break 1.1 h, onceOct 1Fix forward faster
16src/lib/domain/scope/__tests__/stored-pick-is-bootstrap-only.test.tstwo devices, one login — the row answers a device once, at bootstrap > the pin writes NO row — it is a pin, not a pick26one break 1.0 h, onceSep 30Fix forward faster
17src/__tests__/text-send-module-fence.test.ts'none' is closed to new sites — the shrink-only ratchet > no production file declares more 'none' than the ratchet allows, and no new file declares any24one break 2.3 h, onceSep 28Share the scanWalks the source tree with readdirSync and parses every file with the TypeScript compiler to resolve imports of the Twilio and text-send modules. Fix: Read import edges from a shared once-per-run codebase index instead of re-walking and re-parsing the tree.
18src/lib/domain/leasing/__tests__/email-lead-name-home-match.test.tsforwarding-only lead from a renter we already have at this home > reuses the existing person and inquiry: note on her card, no second first email23one break 42 min, onceSep 30Fix forward faster
19src/__tests__/import-guards-read-the-syntax-tree.drift.test.tsimport guards read the syntax tree (shrink-only ratchet) > no NEW test file decides an import by searching source text17repeat 2 separate breaks over 2.2 daysSep 29Auto-update pinIt compares the whole test tree against a hand-kept TEXT_SEARCH_IMPORT_GUARDS list. A PR adding a flagged test isn't selected by the affected lane, so main breaks. Fix: Always run this scan on PRs that add test files, so the new offender fails its own PR.
20src/__tests__/maintenance-comms-activities.test.tsforwardAnswerToTechActivity > a dispatcher skip is BENIGN — no throw, no stamp, and the F-2 marker still clears17one break 1.9 h, onceSep 29Fix forward faster
21scripts/voice-harness/clone-checklist/__tests__/gate-classes.test.tsthe real voice path is fully classified > EVERY gate on the voice path is in one of the two lists16repeat 2 separate breaks over 6 hSep 24Auto-update pinNew voice-path gates land without an entry in the hand-kept SAFETY_ONLY/CALLER_AUDIBLE lists, so main breaks after merge. Fix: Make PRs touching the walked voice directories run this test, so the PR that adds a gate fails.
22src/__tests__/conversation-link-ratchet.drift.test.tsno NEW producer of the retiring /conversations/<id> route > every emitter is on the allowlist — a new one fails here15one break 36 min, onceSep 30Fix forward faster
23src/__tests__/tour-slot-offer-cap-windows-precedence.test.tstour slot offer cap defers to the windows footer — the footer itself (tour-time-windows eval g-voice-on bug) > the windows footer tells the model to offer windo15one break 48 min, onceSep 30Fix forward faster
24src/lib/domain/leasing/__tests__/email-lead-engine-edge-cases.replay.test.tsemail-lead engine — edge-case replay (Graph + SES lanes, hermetic) > quoted-chain-no-in-reply-to — quoted-reply chain with no In-Reply-To header [known: N4]14one break 48 min, onceOct 1Fix forward faster
25src/lib/domain/escalation/__tests__/bake-gate.test.tsapproveEscalationHold — source 'clara_prospect_email' (review mode) > a HELD FIRST TOUCH whose classification signal throws still applies the approve, but repor14one break 36 min, onceSep 24Fix forward faster
Show the other 57 files
#Test file · test that failed mostFailed runsRed forFirst seenSuggestion
26src/__tests__/admin-scope-inventory.drift.test.tsadmin family — the COMPLETE p10-core-contract inventory (A + B1 + B2) > every route matches its pinned gate, scope input and read family13repeat 2 separate breaks over 2.5 daysSep 24Auto-update pinA hand-written INVENTORY of all 150 admin routes (scripts/lib/admin-scope-inventory.ts) must be edited whenever an admin route or gate changes, and roughly 15 PRs touched it this week. Fix: Generate the inventory rows from source, and always run this test on PRs touching src/app/api/admin or middleware.
27src/__tests__/smoke-wo-bugs.test.tsBug 1: No specialist quotes when handyman auto-assigned > plumbing/medium WO with handyman → NO specialist quote emails or Telegram13one break 1.0 h, onceOct 1Fix forward faster
28src/__tests__/list-my-assigned-work-orders.test.tshandleListMyAssignedWorkOrders — the identity walk fails CLOSED on a text line > NO SCOPE, NO READ — a conversation with no property never asks the walk at all12one break 48 min, onceOct 1Fix forward faster
29scripts/__tests__/ci-merge-group-on-demand.drift.test.tsci.yml routes merge_group to on-demand machines > every runs-on in ci.yml routes merge_group to spot=false11one break 30 min, onceSep 30Fix forward faster
30src/__tests__/ci-cost-routing.test.tsRunsOn production label — pinned, no dead override arms > finds exactly one CI_RUNS_ON-gated runs-on: line per switched job11one break 30 min, onceSep 30Fix forward faster
31src/__tests__/legacy-field-elimination.drift.test.tsPhase 5a — total legacy elimination drift guard > no production reference to "'user.email'" survives outside the audit allowlist10repeat 2 separate breaks over 6.9 daysSep 24Auto-update pinRuns git grep for 'user.email' against a hand-kept path allowlist, so separately green PRs that add new reads break main once merged. Fix: Run the grep only on the PR diff's added lines so the adding PR fails, not main afterwards.
32src/lib/domain/leasing/__tests__/clara-guest-card-first-touch-mailbox-gate.test.tsClara's first guest-card touch at a property with a connected mailbox > still honors the master claraLive gate at the send door — suppressed is a hold, not a se10one break 30 min, onceOct 1Fix forward faster
33src/lib/domain/escalation/__tests__/held-draft-staleness.test.tsapproveEscalationHold — a stale prospect draft > the SECOND approve sends the fresh draft — a rewrite is not stale again10one break 30 min, onceOct 1Fix forward faster
34src/lib/data/dynamo/__tests__/onboarding-attempt-no-pii.test.tscompany-connect route — the started-row write never logs or carries secret/token material > every log call on the started-write path logs only non-secret identi10one break 42 min, onceSep 28Fix forward faster
35src/__tests__/promptfoo-corpus.drift.test.tspromptfoo corpus manifest > is current with the catalog and the configs on disk9one break 48 min, onceSep 30Fix forward faster
36src/__tests__/customer-identifier-fence.drift.test.tsmulti-tenancy fence — customer identifiers never compile into shared source > no fixture introduces a customer identifier the baseline has not already recorded9one break 42 min, onceSep 30Fix forward faster
37src/__tests__/property-scope-surface-registry.drift.test.tsroutes that read a caller-supplied propertyId (query, body or path) > are all classified in the registry9one break 42 min, onceSep 29Fix forward faster
38src/lib/domain/leasing/__tests__/guest-card-engine-turn.test.tscomposeClaraFirstTouchViaEngine > falls back to the inquiry row's own unit and the property name when the card names neither9one break 18 min, onceSep 24Fix forward faster
39src/__tests__/conversation-org-stamp-dark.drift.test.tsConversation.organizationId — declared reader set (P6 step 5a) > has NO reader outside the DECLARED set8one break 24 min, onceSep 30Fix forward faster
40src/lib/domain/renewals/__tests__/external-reconcile-sweep.read-ledger.test.tsthe external-reconcile sweep reads each shared index once, not once per building > NEGATIVE CONTROL — with the bound dropped (origin/main's call), every buildin8one break 30 min, onceSep 28Fix forward faster
41src/__tests__/voice-stress-imports.test.tsvoice-stress orchestrator tool loader > getVoiceTools resolves a non-empty tool array7repeat 2 separate breaks over 9 hSep 28Move to nightlygetVoiceTools cold-loads the tools-leasing graph (~10.7k lines). On a busy CI shard this hit the 60s limit, so it only guards the nightly voice-stress script. Fix: Run the getVoiceTools check as a preflight step in the nightly voice-stress job, alerting on failure.
42src/__tests__/conversation-single-writer.drift.test.tsF10 — dynamo/conversation.ts export surface is pinned (the post-F7 door) > every module-level export is pinned with a reason7one break 18 min, onceSep 30Fix forward faster
43src/__tests__/d1-confirm-table-guard.drift.test.tsD1 confirm-table guard — drift > every confirm-table-gated script is classified GUARDED or EXEMPT7one break 12 min, onceSep 25Fix forward faster
44src/__tests__/specialist-prompt-drift.test.tsspecialist prompt parity — shared fleet (live ElevenLabs vs what is deployed) > Clara — Leasing prompt + first_message match voice-agents/leasing.ts6repeat 5 separate breaks over 1.8 daysSep 28Move to nightlyCompares live ElevenLabs agent prompts with the repo; breaks when on-merge sync fails or someone edits an agent in the dashboard. Fix: Take it out of the merge gate; run it on a nightly or after-sync cron that alerts #alerts.
45src/__tests__/guard-pin-kinds.drift.test.tsguard pin kinds > mutation controls > an unsure bookkeeping entry goes red6one break 6 min, onceSep 30Fix forward faster
46src/lib/integrations/email/__tests__/company-live-gate-one-seam.test.tsthe one-seam invariant > a voice dial site or a text-only send site declares, and is deliberately OUT OF SCOPE for the email map6one break 36 min, onceSep 29Fix forward faster
47src/__tests__/get-tenants-passthrough.drift.test.tsget-tenants-passthrough.drift (ADR-0035 Phase F Slice 3b) > every bare getTenants() caller is on the ALL-tenants allowlist6one break 12 min, onceSep 24Fix forward faster
48src/lib/domain/settings/__tests__/settings-search-index.drift.test.tssettings search index > every anchor exists as an id on its own level's page source5one break 6 min, onceSep 24Fix forward faster
49src/__tests__/process-inbound-message-thread-bypass.test.tsprocessInboundEmailMessage — thread-context bypass wiring > reply bridge — an inbound email stops a running outreach cadence > non-bypass in-thread reply signal4one break 36 min, onceOct 1Fix forward faster
50src/__tests__/detail-back-href-canonical.test.tsdetail back href — one constant, no hand-rolled copies > no entity detail file hand-rolls its own "Back to …" destination4one break 30 min, onceSep 28Fix forward faster
51src/app/api/leasing/stats/__tests__/route.multi-org.test.tsa two-org selection is ANSWERED, not refused > is no longer a 400 — the refusal this leg replaced4one break 24 min, onceSep 26Fix forward faster
52src/app/api/leasing/stats/__tests__/route.selection.test.tstwo orgs is LOADED PER ORG, never unioned and never refused (ST-136) > names no single building on either leg4one break 24 min, onceSep 26Fix forward faster
53src/app/api/leasing/pipeline-members/__tests__/route.badge-drawer-agreement.test.tsone URL, one answer — the badge and the drawer agree on the building set > MANY-ORGS: the two routes fold the SAME building set, one leg per company4one break 24 min, onceSep 26Fix forward faster
54src/__tests__/specialist-transfers-drift.test.tsspecialist transfers — repo vs live drift > live unknown_caller_agent agent transfers MATCH the repo config (no drift)3repeat 3 separate breaks over 1.1 daysSep 30Move to nightlyIt calls the live ElevenLabs API and compares live agent transfers to repo config, so main goes red whenever the live agents and main drift apart. Fix: Run the live repo-vs-ElevenLabs comparison nightly or after the sync deploy, with an alert; keep only the offline tests in CI.
55src/__tests__/renewal-letter-mms-retry-route.test.tsPOST /api/leasing/renewals/[leaseId]/letter-mms-retry > PM double-click within the same minute produces the same eventId (workflow + activity dedup)3repeat 3 separate breaks over 2.6 daysSep 24Fake the clockThe double-click test calls POST twice on the real clock and expects the same minute-bucketed eventId, so it flakes when a minute boundary falls between calls. Fix: Call vi.useFakeTimers() and vi.setSystemTime() to a fixed mid-minute instant in that test.
56src/__tests__/decide-deploy-queue-stuck.test.tsdeploy-queue-watchdog.yml coverage > watches exactly the workflows whose queue one stuck run can freeze3one break 12 min, onceOct 1Fix forward faster
57src/__tests__/lib-data-mock-shape.drift.test.ts@/lib/data mock-shape drift guard (PR #1762) > every @/lib/data mock spreads importOriginal/importActual (or is allowlisted)3one break 18 min, onceSep 30Fix forward faster
58src/__tests__/audit-prod-invariants-signatures.test.tsaudit-prod-invariants — invariant call signatures > audit-prod-invariants.ts loads RenewalSaga entities (regression guard for nightly-2026-05-25)3one break 30 min, onceSep 30Fix forward faster
59src/app/api/admin/modules/buildings/__tests__/route.test.tsGET /api/admin/modules/buildings > lists each building's state next to the company's own switch3one break 18 min, onceSep 29Fix forward faster
60scripts/eval/__tests__/module-send-gate-declarations.test.tsderiveDeclaredCells — the real tree (the drift pin) > so the NOT APPLICABLE set is exactly email × collections, voice × prospects, voice × collections3one break 18 min, onceSep 29Share the scanreadProductionSources walks the whole tree and parses every file with the TypeScript compiler; fixtures also build a ts.createProgram each. Fix: Use a shared once-per-run parsed-source index for the real-tree drift pin.
61src/__tests__/leasing.test.tsGET /api/leasing/stats > computes leasing Metrics3one break 36 min, onceSep 26Fix forward faster
62src/lib/domain/agentflow/__tests__/smith-sessions.phase-sweep.test.tsgetSmithSessions — the phase sweep is off the read path > a status() query that never answers does not hold the read: it returns before any timer runs, phase un3one break 18 min, onceSep 26Fix forward faster
63src/__tests__/self-review-unresolvable-range.test.tsself-review: an unresolvable range is UNKNOWN, never a pass > a range that RESOLVES and is empty passes, and says which of the two it is3one break 18 min, onceSep 25Slim it downEach test spawns the real scripts/self-review.sh, and two tests run the identical bad-base invocation separately. Fix: Run the bad-base invocation once in beforeAll and share its output across both tests.
64src/__tests__/live-equals-main.drift.test.tslive == main — turn config (live ElevenLabs vs repo TURN exports) > Clara — Escalation Answer Callback (Outbound) turn config matches main2repeat 2 separate breaks over 8 hSep 30Move to nightlyFetches live ElevenLabs agent configs. It fails whenever a merged TURN change isn't synced to the fleet within 24h, e.g. the Escalation Callback agent. Fix: Run it as a nightly check that alerts and re-runs sync-specialists, not as a merge gate.
65src/__tests__/tool-handlers.test.tshandleCreateWorkOrder > does NOT auto-approve an EXTERNAL-vendor WO with no estimate — unknown spend fails closed2one break 12 min, onceSep 25Fix forward faster
66src/__tests__/sms-review-gate-e2e.test.tsAnomaly Review Gate — SMS/email agent loop (#5131) > CONTROL: the turn actually reaches the fatal failure2one break 12 min, onceSep 25Fix forward faster
67src/__tests__/duplicate-wo-race.test.tsDuplicate WO race condition (Sean bug 2026-03-14) > allows WO creation for different conversations2one break 12 min, onceSep 25Fix forward faster
68src/__tests__/thread-context-bypass.test.tscheckThreadContextBypass — negative cases (must NOT bypass) > does NOT bypass when person has conversations only at OTHER properties (cross-property guard)2one break 12 min, onceSep 25Fix forward faster
69src/__tests__/handyman-create-wo.test.ts#41 handyman create — falls through to tenant path > ENDED membership → router outputs flag=false → gate skips (primary path, review #1736 F2)2one break 12 min, onceSep 25Fix forward faster
70agents/clara/lib/agent/__tests__/conversation-read-dedup.test.tsschedule_tour — conversation read is deduped > loads the conversation exactly once (property default + phone read share the row)2one break 12 min, onceSep 25Fix forward faster
71src/__tests__/create-wo-report-backstamp.test.tshandleCreateWorkOrder back-stamps the report segment > FIRST-TYPE-WINS: a maestro renewal row inside the segment keeps its type through the create-time backstam2one break 6 min, onceSep 24Fix forward faster
72src/__tests__/specialist-voice-sound-drift.test.tsspecialist voice sound parity (live ElevenLabs) > live Clara — Leasing agent sound MATCHES the repo config (no drift)1one break 0 min, onceOct 1Fix forward faster
73src/__tests__/specialist-tool-drift.test.tsSpecialist tool drift (catalog ⇄ live ElevenLabs) > no catalog-claimed tool name is bound twice to the SAME agent1one break 0 min, onceOct 1Fix forward faster
74src/__tests__/live-state-discipline.drift.test.tsrepo-wide guards that read outside state declare how they stay fair > CONTROL — the detector finds BOTH known instances of the class1one break 0 min, onceSep 30Fix forward faster
75scripts/__tests__/workflow-grep-marker-ratchet.drift.test.tsthe live workflows: every grep is annotated or already on the baseline > no new unannotated grep1one break 0 min, onceSep 30Fix forward faster
76src/__tests__/apply-tour-intent.test.tsapplyTourIntent > self-guided lockbox-code ask wiring (propose/confirm/reschedule) > SELF-GUIDED TOUR: autoConfirmed propose fires the lockbox-code ask; an in_p1one break 0 min, onceSep 29Fix forward faster
77lambda/stage-replicator/__tests__/spine-throttle-retry.test.tsan exhausted spine-index throttle hands the whole batch back once > THE HEADLINE: a 100-record batch builds the dictionary ONCE and reports only the first recor1one break 0 min, onceSep 28Fix forward faster
78src/lib/domain/properties/__tests__/property-directory-refresh-read-path.test.tsthe directory read touches only the AppFolio Reporting API > reads property_directory over the Reports API — no robot, no warm-up, no Redis1one break 0 min, onceSep 26Fix forward faster
79src/__tests__/outlook-webhook-extraction-lifecycle.test.tsextraction lifecycle — needs_review tenant-rescue arm > rescued-extraction rejection → flow still resolves cleanly, error logged under the rescue tag, bookkeepi1one break 0 min, onceSep 24Fix forward faster
80src/lib/domain/pms/mirror/__tests__/guest-card-mirror-per-inquiry-emit.test.tsmirrorGuestCards — one lead.received per inquiry (#11097) > this home's tick never emits another home's inquiry1one break 0 min, onceSep 24Fix forward faster
81src/lib/integrations/voice/store.test.tsresolveVoiceConversationId — fan-out regression guard > reuses the already-loaded meta set for the phone fallback instead of a second read1one break 0 min, onceSep 23Fix forward faster
82src/__tests__/dangerous-diff-label-in-ci.drift.test.tsthe single glob source > `globs` is byte-identical to auto-merge-all.yml rule 3 (until that file is deleted)1one break 0 min, onceOct 1Fix forward faster

Quarantine candidates: files that broke main more than once

These are the ones a flaky-test quarantine would actually catch. A break is counted again when the test fails after more than 3 hours of passing.

Test file · testBreaksFailed runsSuggestion
src/__tests__/user-route-inventory.drift.test.tsuser-route inventory — the pin matches the tree > MUTATION CONTROL: a route that gains a raw company equality is SCOPE moved and MISREAD651Auto-update pinThe hand-kept route pin goes stale when routes are added; the mutation control also edits the real collections route by string-match and needs it pinned 'selection'. Fix: Generate the pin from a script, and run the mutation control on a fixture route instead of a real one.
src/__tests__/specialist-prompt-drift.test.tsspecialist prompt parity — shared fleet (live ElevenLabs vs what is deployed) > Clara — Leasing prompt + first_message match voice-agents/leasing.ts56Move to nightlyCompares live ElevenLabs agent prompts with the repo; breaks when on-merge sync fails or someone edits an agent in the dashboard. Fix: Take it out of the merge gate; run it on a nightly or after-sync cron that alerts #alerts.
src/__tests__/live-agent-roster.drift.test.tslive-agent roster — live ElevenLabs vs this repo > every live agent is declared by the repo or listed as expected-unmanaged428Move to nightlyCalls the live ElevenLabs API and fails whenever a throwaway agent is left in the workspace or a declared agent is deleted. Those are drifts no PR makes. Fix: Run the live roster comparison nightly with an alert; keep only the no-network shape describe in the merge gate.
src/__tests__/specialist-transfers-drift.test.tsspecialist transfers — repo vs live drift > live unknown_caller_agent agent transfers MATCH the repo config (no drift)33Move to nightlyIt calls the live ElevenLabs API and compares live agent transfers to repo config, so main goes red whenever the live agents and main drift apart. Fix: Run the live repo-vs-ElevenLabs comparison nightly or after the sync deploy, with an alert; keep only the offline tests in CI.
src/__tests__/renewal-letter-mms-retry-route.test.tsPOST /api/leasing/renewals/[leaseId]/letter-mms-retry > PM double-click within the same minute produces the same eventId (workflow + activity dedup)33Fake the clockThe double-click test calls POST twice on the real clock and expects the same minute-bucketed eventId, so it flakes when a minute boundary falls between calls. Fix: Call vi.useFakeTimers() and vi.setSystemTime() to a fixed mid-minute instant in that test.
src/__tests__/entity-conversation-routes.test.tsxwork order — /maintenance/work-orders/[displayId]/conversation > offers NO copy-link when the thread has no person, rather than a url built from undefined232KeepNot a flake: a module-level 30s memo cache (#13169) leaked between tests, and #13168 changed firstChunk; shard debounce-skips hid the red. Fix: Reset every module-level TtlCache memo in a global vitest setup, and run full shards for route changes.
src/__tests__/import-guards-read-the-syntax-tree.drift.test.tsimport guards read the syntax tree (shrink-only ratchet) > no NEW test file decides an import by searching source text217Auto-update pinIt compares the whole test tree against a hand-kept TEXT_SEARCH_IMPORT_GUARDS list. A PR adding a flagged test isn't selected by the affected lane, so main breaks. Fix: Always run this scan on PRs that add test files, so the new offender fails its own PR.
scripts/voice-harness/clone-checklist/__tests__/gate-classes.test.tsthe real voice path is fully classified > EVERY gate on the voice path is in one of the two lists216Auto-update pinNew voice-path gates land without an entry in the hand-kept SAFETY_ONLY/CALLER_AUDIBLE lists, so main breaks after merge. Fix: Make PRs touching the walked voice directories run this test, so the PR that adds a gate fails.
src/__tests__/admin-scope-inventory.drift.test.tsadmin family — the COMPLETE p10-core-contract inventory (A + B1 + B2) > every route matches its pinned gate, scope input and read family213Auto-update pinA hand-written INVENTORY of all 150 admin routes (scripts/lib/admin-scope-inventory.ts) must be edited whenever an admin route or gate changes, and roughly 15 PRs touched it this week. Fix: Generate the inventory rows from source, and always run this test on PRs touching src/app/api/admin or middleware.
src/__tests__/legacy-field-elimination.drift.test.tsPhase 5a — total legacy elimination drift guard > no production reference to "'user.email'" survives outside the audit allowlist210Auto-update pinRuns git grep for 'user.email' against a hand-kept path allowlist, so separately green PRs that add new reads break main once merged. Fix: Run the grep only on the PR diff's added lines so the adding PR fails, not main afterwards.
src/__tests__/voice-stress-imports.test.tsvoice-stress orchestrator tool loader > getVoiceTools resolves a non-empty tool array27Move to nightlygetVoiceTools cold-loads the tools-leasing graph (~10.7k lines). On a busy CI shard this hit the 60s limit, so it only guards the nightly voice-stress script. Fix: Run the getVoiceTools check as a preflight step in the nightly voice-stress job, alerting on failure.
src/__tests__/live-equals-main.drift.test.tslive == main — turn config (live ElevenLabs vs repo TURN exports) > Clara — Escalation Answer Callback (Outbound) turn config matches main22Move to nightlyFetches live ElevenLabs agent configs. It fails whenever a merged TURN change isn't synced to the fleet within 24h, e.g. the Escalation Callback agent. Fix: Run it as a nightly check that alerts and re-runs sync-specialists, not as a merge gate.

Four of these call live ElevenLabs and compare it to the repo (specialist-prompt-drift, live-agent-roster, specialist-transfers-drift, live-equals-main). They go red whenever someone edits an agent in ElevenLabs, whatever the code says. That makes them better suited to a nightly alert than a merge gate. user-route-inventory is the single worst offender: 6 breaks in 7 days, because every new page route has to be added to its pin.

2 · Which tests take longest — top 200 of 7,585 files, and the slowest single tests
7,585
test files timed across 25 runs
53 min
of test run time per full run, added up over every parallel worker (the wall clock is ~14 min)
43
files average over 10 s; 7 over 30 s
40%
of test time is the slowest 100 files

Average is the mean across 25 complete runs on Oct 1. Per test is the file's average divided by its number of tests: a high value means a few heavy tests, not a big file.

#Test fileAverageMedianSlowestTestsPer testSuggestion
1src/__tests__/appfolio-client.test.ts67.7s67.8s72.6s252.7sFake the clockThe '5xx via appfolioPolicy' test uses real timers and waits through the whole retry/backoff ladder (120s timeout); the other 429 tests already fake time. Fix: Use vi.useFakeTimers in the 5xx test and step through the backoff with advanceTimersByTimeAsync.
2src/__tests__/household-harness/household-matrix.test.ts44.9s40.6s53.4s331.4sSlim it downEvery invariant test loops all scenarios and re-runs projectHouseholds/runHouseholdSync (the sync runs twice) on the real JSON file store, with the same rows over and over. Fix: Compute each scenario's baseline projection once in beforeAll and reuse it in the invariant tests.
3scripts/__tests__/mutation-control-invocation.test.ts43.9s43.8s51.6s114.0sMove to nightlyThree tests spawn `npx tsx check-mutation-control.ts`, one running a fixture-git-repo control; each spawn cold-starts tsx (≈44s total). Fix: Move the three CLI-spawning exit-code tests to a nightly lane; keep the in-process parser and selection tests gating.
4scripts/__tests__/guards-for-paths.test.ts43.1s40.2s48.9s123.6sShare the scanEach of 12 tests spawns `node guards-for-paths.mjs`, which re-lists and re-greps ~850 candidate guard files from scratch. Fix: Import the selector in-process and build the candidate index once in beforeAll, shared by all cases.
5src/__tests__/review-verdict-watchdog-pages-surgically.test.ts42.8s42.8s43.6s321.3sMove to nightlyEach of about 32 cases writes stub gh/curl into a temp dir and spawns bash to run the real workflow sweep script. Fix: Run it only on PRs that touch the watchdog workflow, plus nightly.
6src/__tests__/convention-files-phosphor-server-safe.drift.test.ts39.2s36.4s45.4s3180.1sShare the scanIt globs every route convention file and, for each of about 318, walks its import graph from scratch with readFileSync/existsSync, re-reading shared modules every time. Fix: Build one import-graph index per run, cached across entries, and query it for each convention file.
7src/lib/data/dynamo/__tests__/batch-get-callers-reread.test.ts34.2s34.2s34.4s93.8sFake the clockThe header says 'Real timers — one exhausted retry budget is ~3s', and every case runs a five-attempt batchGet backoff on the real clock. Fix: Use vi.useFakeTimers() with runAllTimersAsync, or inject a zero backoff delay into the batchGet retry helper.
8lambda/appfolio-sync/__tests__/onboarding-import-runner.test.ts27.5s27.5s27.6s780.4sKeepCould not pin it down. Every failing-stage test already injects a no-op sleep, so the cost seems to be 78 real stage-chain runs. Fix: No cheap fix found; profile per-test durations before changing anything.
9scripts/eval/__tests__/module-send-gate-declarations.test.ts25.8s22.8s33.6s1160.2sShare the scanreadProductionSources walks the whole tree and parses every file with the TypeScript compiler; fixtures also build a ts.createProgram each. Fix: Use a shared once-per-run parsed-source index for the real-tree drift pin.
10src/__tests__/roster-gate-call-sites.drift.test.ts23.7s21.8s28.6s102.4sShare the scanreadFirstPartySources walks all of src/agents/lambda/scripts five times: once for the main scan, then again for each P0b missing-root case through symlinks. Fix: Use a shared cached source index, and test the missing-root check on a tiny fixture tree.
11src/__tests__/text-send-module-fence.test.ts23.6s24.1s30.6s280.8sShare the scanWalks the source tree with readdirSync and parses every file with the TypeScript compiler to resolve imports of the Twilio and text-send modules. Fix: Read import edges from a shared once-per-run codebase index instead of re-walking and re-parsing the tree.
12src/__tests__/schedule-tour-volunteered-email.test.ts22.2s21.1s25.5s250.9sSlim it downbeforeEach calls vi.resetModules, so every one of 25 tests re-imports tools-leasing and its leasing domain graph, plus a data/seed copy. Fix: Import tools-leasing once in beforeAll and swap mock return values per test, without resetModules.
13src/__tests__/lambda-eager-ai-client.drift.test.ts21.1s19.4s24.9s73.0sMove to nightlySpawns `npx tsx lambda/<name>/build.ts` (a full esbuild bundle) for each of 7 candidate lambdas to read their metafiles. Fix: Run only when lambda/ or its imports change, plus nightly, or reuse CI's existing lambda build metafiles.
14src/__tests__/calendar-stub-fence.drift.test.ts18.4s17.9s26.2s82.3sShare the scanimporters() runs `git ls-files` over four roots and reads every tracked file on each call, and multiple tests call it. Fix: Compute importers() once in beforeAll, or read it from a shared once-per-run codebase index.
15src/lib/domain/conversations/__tests__/turn-score.test.ts18.1s18.1s22.4s720.3sFake the clockThe ECONNRESET tests go through the real scoringClaudePolicy retry, which sleeps 2s/4s/8s (≈14s) before giving up. Fix: Use fake timers in the vendor-failure tests, or inject a zero-delay retry policy into scoreConversationTurns.
16src/__tests__/turn-checks-route-fence.drift.test.ts17.0s15.3s20.7s53.4sShare the scanIt walks every file under src/app with readdirSync and follows each file's import chain by reading source files. Fix: Read import edges from a shared once-per-run import-graph index instead of its own readdirSync walk.
17src/lib/domain/conversations/__tests__/trajectory-review-llm.test.ts16.4s16.7s19.5s330.5sFake the clockThe two 'network blip' transport-error tests go through the real scoringClaudePolicy retry, waiting out its real backoff. Fix: Fake timers in the transport-error tests, or inject a no-delay retry policy.
18scripts/__tests__/scope-parity-replay-pair-coverage.drift.test.ts16.3s14.6s21.4s161.0sShare the scancheckPairCoverage(root) scans the real tree three times, and scanFieldReaders reads more than 1000 product files on top of that. Fix: Scan the real tree once in beforeAll and run the without-owed-list variants against that cached result.
19src/__tests__/audit-channels.test.ts15.6s14.9s18.1s320.5sSlim it downEach describe calls vi.resetModules() before every test, then re-imports heavy modules (Twilio webhook route, dispatcher, voice personalization route) per test across 32 tests. Fix: Import each route or module once per describe in beforeAll; reset the mock state, not the module graph.
20src/app/(workspace)/(operations)/agents/__tests__/page.decision-queue.test.tsx15.6s14.9s18.6s940.2sSlim it down94 tests each mount the full AgentsPageClient in jsdom with a stubbed fetch, and 8 call settleUrl, which waits a real 500ms. Fix: Share one mount per describe block where possible and fake timers for the 400ms URL write delay.
21src/lib/domain/scope/__tests__/operator-authority-seam.drift.test.ts15.5s14.4s18.7s43.9sShare the scanWalks all of src/ with readdirSync/statSync and reads and comment-strips every .ts/.tsx file to regex-match writer shapes. Fix: Read files from a shared once-per-run comment-stripped source index instead of its own walk.
22evals/replay-harness/guest-card-corpus/__tests__/judge-row-resilience.test.ts15.5s15.5s15.6s111.4sFake the clockjudgeOne really sleeps 500ms×attempt between retries on bad JSON (judge.ts:2540), and judgeRowResilient retries it, so each failing case waits several seconds. Fix: Use vi.useFakeTimers with runAllTimersAsync, or inject a zero retry delay into judgeOne.
23src/app/(workspace)/(operations)/leasing/prospects/ProspectsClient.stage-insight.test.tsx14.4s14.2s15.1s91.6sFake the clockswitchTab, clickFigure and the deep-link test each sleep a real 600ms setTimeout, repeated across 9 tests. Fix: Use vi.useFakeTimers() and advanceTimersByTimeAsync(600) instead of real sleeps.
24src/__tests__/send-application-link.test.ts14.4s12.9s17.9s920.2sSlim it downbeforeEach runs vi.resetModules, then 73 separate dynamic imports reload send-application-link and its dependency graph for each of 92 tests. Fix: Import the module once at file scope and reset mock state per test, not modules.
25src/__tests__/self-review-unresolvable-range.test.ts14.3s13.8s16.4s52.9sSlim it downEach test spawns the real scripts/self-review.sh, and two tests run the identical bad-base invocation separately. Fix: Run the bad-base invocation once in beforeAll and share its output across both tests.
26src/__tests__/outlook-webhook-fetch-retry.test.ts14.2s14.3s15.8s101.4sFake the clockIt runs the real graphMail retry policy (500ms initial, 5s max backoff, Retry-After up to 10s) with real timers through repeated 503/throttle cases. Fix: Use vi.useFakeTimers and advance timers instead of waiting out the real backoff.
27src/__tests__/schedule-tour-failure-reaches-review-gate.test.ts14.1s12.7s17.6s260.5sSlim it downbeforeEach runs vi.resetModules(), so each of 26 tests re-imports the heavy tools-leasing and voice-review-gate module graph under many importOriginal mocks. Fix: Import tools-leasing and the gate modules once in beforeAll; reset mocks and breaker state between tests instead.
28src/lib/domain/leasing/__tests__/listing-geocode.test.ts14.0s14.0s14.0s260.5sFake the clockThe real geocoder enforces a 1s Nominatim gap between calls and retries 3 times, so tests wait on real setTimeout sleeps. Fix: Use vi.useFakeTimers or inject the sleep and gap so retries resolve instantly.
29src/__tests__/conversation-partition-fanout-pinned.drift.test.ts13.2s12.2s17.3s34.4sShare the scanRuns `git ls-files` and parses every tracked non-test TS file with the TypeScript compiler to find partition fan-out call sites. Fix: Use a shared once-per-run parsed-AST index of tracked sources.
30src/lib/data/dynamo/__tests__/batch-get-reports-given-up-keys.test.ts13.1s13.1s13.2s91.5sFake the clockThe wire throttles keys through all five batchGet attempts plus the re-read, and the helper's real retry backoff runs with real timers (no fake timers in the file). Fix: Use vi.useFakeTimers and runAllTimersAsync, like tour-calendar-window's throttle tests already do.
Show files 31–200
#Test fileAverageMedianSlowestTestsPer testSuggestion
31src/__tests__/ci-guard-pin-coverage.drift.test.ts12.7s11.9s14.3s160.8sSlim it downSpawns node for the union script twice and the selector at least twice (each scans the repo), plus git ls-files and a git init temp repo. Fix: Run the union and selector scripts once each in beforeAll and reuse their output across all assertions.
32src/__tests__/d1-guard-import-order.drift.test.ts12.6s11.2s16.0s62.1sShare the scanIt walks the scripts tree with readdirSync and parses each file with ts.createSourceFile to resolve import closures; it once ran over 60s. Fix: Resolve import closures from a shared once-per-run TypeScript import-graph index.
33src/__tests__/lib-coverage-gaps.test.ts12.6s12.6s13.4s170.7sSlim it downSeveral describe blocks call vi.resetModules in beforeEach and re-import big modules (store, quotes generator, elevenlabs client) for each test. Fix: Import each module once per describe in beforeAll; reset only the mocks per test.
34src/lib/data/dynamo/__tests__/tour-calendar-window.test.ts12.4s12.4s12.6s170.7sFake the clockThe dropped-key tests for undated tours and the month read use real timers, so the batchGet retry backoff runs at real speed; only two other tests fake the clock. Fix: Turn on fake timers in beforeEach and await runAllTimersAsync in every test that drops a key.
35scripts/__tests__/table-default-drift.test.ts12.4s11.6s13.7s280.4sSlim it downThree tests each spawn `npx tsx` on the check CLI, though the in-process scanTree tests already cover the same detection logic. Fix: Keep one CLI spawn that checks both exit codes; cover the empty and missing-root cases through scanTree in-process.
36src/app/(workspace)/(operations)/leasing/prospects/ProspectsClient.date-window.test.tsx11.8s11.9s12.3s180.7sFake the clockAbout 22 date-range picks each wait a real 500ms for the URL write delay, roughly 11s of the 11.8s total. Fix: Use vi.useFakeTimers and advanceTimersByTime(500) instead of real setTimeout waits.
37src/__tests__/guard-union-kind-filter.test.ts11.4s11.5s12.8s52.3sSlim it downbeforeAll spawns node guard-union-files.mjs three times (default, all, fence); each run builds the full 900+ pin union. Fix: Spawn once; get the fence list with the pure filterPinsByKind function, keeping one env-path spawn.
38src/__tests__/speakable-tour-availability.test.ts11.2s10.6s14.1s250.4sSlim it downbeforeEach calls vi.resetModules, so every test re-imports heavy modules (tools-leasing, @/lib/data, calendar) dynamically from scratch. Fix: Drop the per-test resetModules, import the modules once at the top, and reset state through mocks.
39src/__tests__/line-coverage-no-dashboard-writer.drift.test.ts11.1s10.0s13.9s81.4sShare the scanWalks production roots with readdirSync and resolves import reachability (reachesSymbols, client-import-graph) across the whole tree. Fix: Answer the reachability query from a shared once-per-run import graph index instead of walking per test file.
40src/__tests__/tour-booking-reads-every-calendar.test.ts10.5s9.3s13.2s170.6sSlim it downbeforeEach calls vi.resetModules, then re-imports tools-leasing and its leasing graph, plus a data/seed copy, for each of 17 tests. Fix: Import tools-leasing once in beforeAll and change the calendar fakes per test, without resetModules.
41src/lib/domain/portfolio/context/__tests__/raw-store-importers.drift.test.ts10.2s9.2s12.7s101.0snot reviewed
42src/lib/integrations/appfolio/__tests__/balances-portfolio.test.ts10.2s10.3s11.0s101.0snot reviewed
43scripts/email-stress/__tests__/wait-for-reply.test.ts10.0s10.0s10.0s61.7snot reviewed
44evals/replay-harness/guest-card-corpus/__tests__/bound-home-concessions.test.ts9.8s8.8s12.3s180.5snot reviewed
45src/__tests__/turnover-client.test.ts9.7s9.4s11.8s91.1snot reviewed
46src/__tests__/wo-displayid-drift-guards.test.ts9.6s9.1s11.1s120.8snot reviewed
47src/lib/data/dynamo/__tests__/calendar-day-window.prefilter.test.ts9.4s9.4s9.5s51.9snot reviewed
48src/lib/data/dynamo/__tests__/conversation-home-read.test.ts9.3s9.3s9.4s61.6snot reviewed
49scripts/__tests__/find-culprit.test.ts9.3s9.8s12.5s160.6snot reviewed
50src/__tests__/specialist-system-tool-binding.drift.test.ts9.2s6.0s39.5s370.2snot reviewed
51src/app/(workspace)/(operations)/leasing/prospects/ProspectsClient.funnel.test.tsx9.2s9.1s9.8s160.6snot reviewed
52src/__tests__/workspace-loading-shell-honest-values.drift.test.tsx9.1s8.6s10.9s1200.1snot reviewed
53src/__tests__/quote-parser-resilience.test.ts9.1s9.1s9.1s400.2snot reviewed
54src/lib/domain/vendors/__tests__/pick-vendor.parity.test.ts9.0s8.3s11.1s900.1snot reviewed
55scripts/__tests__/check-deleted-file-importers.test.ts8.7s8.2s10.2s100.9snot reviewed
56src/__tests__/post-checkout-provision-lock.test.ts8.6s8.8s9.1s160.5snot reviewed
57src/__tests__/tour-booking-refusal-is-not-availability.test.ts8.6s8.1s10.7s140.6snot reviewed
58scripts/__tests__/self-review-eslint-verdict.test.ts8.5s8.0s10.1s71.2snot reviewed
59src/__tests__/specialist-turn-drift.test.ts8.5s7.7s25.6s1690.1snot reviewed
60src/__tests__/dashboard-home.test.ts8.4s8.2s10.3s160.5snot reviewed
61src/__tests__/legacy-field-elimination.drift.test.ts8.3s8.9s9.4s520.2sAuto-update pinRuns git grep for 'user.email' against a hand-kept path allowlist, so separately green PRs that add new reads break main once merged. Fix: Run the grep only on the PR diff's added lines so the adding PR fails, not main afterwards.
62src/__tests__/vercel-promote-await.test.ts8.3s8.5s8.7s110.8snot reviewed
63agents/clara/lib/agent/tools/renewal/__tests__/renewal-email-suppression.test.ts8.2s8.3s9.0s240.3snot reviewed
64src/__tests__/renewal-policy-single-home.drift.test.ts8.2s7.6s9.1s120.7snot reviewed
65src/__tests__/af-vendor-stamp.drift.test.ts8.1s7.4s9.2s71.2snot reviewed
66src/lib/temporal/activities/__tests__/remediate-turnover-strands-activity.test.ts7.8s7.8s8.6s250.3snot reviewed
67src/__tests__/store-conditional.test.ts7.7s7.7s8.1s160.5snot reviewed
68src/__tests__/merge-evidence-decision.test.ts7.7s8.2s9.3s710.1snot reviewed
69scripts/overnight/run.test.ts7.3s7.0s9.0s110.7snot reviewed
70src/lib/domain/leasing/__tests__/google-maps-failure-loud.test.ts7.0s7.0s7.0s71.0snot reviewed
71src/lib/integrations/appfolio/__tests__/report-snapshot-cache.test.ts7.0s7.0s8.0s100.7snot reviewed
72src/__tests__/twilio-webhook.test.ts7.0s7.2s7.9s710.1snot reviewed
73src/__tests__/conversation-manager.test.ts6.8s6.9s8.0s4470.0snot reviewed
74scripts/voice-fastlane/__tests__/reachability.test.ts6.7s6.1s8.2s230.3snot reviewed
75src/__tests__/conversation-org-stamp-dark.drift.test.ts6.7s6.1s7.6s71.0snot reviewed
76src/__tests__/workspace-loading-shell-status-marker.test.tsx6.6s6.2s7.7s1190.1snot reviewed
77scripts/__tests__/sync-specialist-prompts-agent-id.test.ts6.6s5.8s8.0s300.2snot reviewed
78src/__tests__/maintenance-action-gate.test.ts6.5s6.1s8.1s260.3snot reviewed
79src/__tests__/inbound-org-scope.drift.test.ts6.5s5.9s7.8s200.3snot reviewed
80src/__tests__/scripts-import-resolution.drift.test.ts6.4s5.7s8.4s23.2snot reviewed
81src/lib/domain/tenants/__tests__/load-tenants-list.contact-reads.test.ts6.4s6.4s6.5s70.9snot reviewed
82src/__tests__/vendor-card-write-paths.drift.test.ts6.4s5.6s7.4s70.9snot reviewed
83src/__tests__/auto-merge-guard-decision.test.ts6.3s5.8s8.0s1580.0snot reviewed
84src/__tests__/tour-day-policy.test.ts6.3s6.5s8.1s450.1snot reviewed
85src/__tests__/leasing-settings-write-only-fields.drift.test.ts6.3s5.7s7.9s540.1snot reviewed
86src/__tests__/property-owner-id-retired.drift.test.ts6.3s5.9s7.5s150.4snot reviewed
87src/lib/integrations/email/__tests__/company-live-gate-one-seam.test.ts6.2s6.0s7.2s330.2snot reviewed
88src/__tests__/client-bundle-no-temporal-leak.drift.test.ts6.2s5.8s7.5s110.6snot reviewed
89src/__tests__/tech-sms-dispatch.test.ts5.9s6.0s6.7s350.2snot reviewed
90src/app/(workspace)/(operations)/agents/_components/__tests__/pane-terminal-no-passive-resize.test.tsx5.8s5.8s5.9s51.2snot reviewed
91src/__tests__/conversation-detail-page-ssr-seed.test.ts5.8s5.5s7.2s80.7snot reviewed
92src/lib/domain/pms/__tests__/guest-card-outbox-drain-runner.test.ts5.8s5.3s7.0s540.1snot reviewed
93src/__tests__/leasing-tools.test.ts5.7s5.6s6.6s4740.0snot reviewed
94scripts/__tests__/main-lane-red-alert.test.ts5.6s5.6s6.9s550.1snot reviewed
95scripts/__tests__/test-affected-invocation-shapes.test.ts5.6s5.4s6.2s41.4snot reviewed
96src/__tests__/alerts-emitters-transmit-marker.test.ts5.5s5.5s5.9s490.1snot reviewed
97src/__tests__/api-routes-voice.test.ts5.5s5.7s6.5s4880.0snot reviewed
98scripts/__tests__/eval-judge-oauth-gate.drift.test.ts5.5s4.8s7.0s41.4snot reviewed
99src/__tests__/review-fallback-submission.test.ts5.4s4.9s6.8s1110.0snot reviewed
100src/__tests__/touch-budget-hold-crosses-the-door.test.ts5.4s5.4s5.9s120.5snot reviewed
101src/app/(workspace)/(operations)/leasing/prospects/ProspectsClient.card-filter.test.tsx5.4s5.4s5.7s60.9snot reviewed
102src/__tests__/external-clients.test.ts5.4s5.1s6.3s470.1snot reviewed
103src/__tests__/outlook-webhook-attachment-metadata.test.ts5.3s5.4s6.1s120.4snot reviewed
104src/__tests__/tour-email-actions.test.ts5.3s5.1s6.4s190.3snot reviewed
105src/__tests__/set-free-month-applies-to-args.test.ts5.3s5.1s6.5s51.1snot reviewed
106lambda/inbound-processor/__tests__/inbox-email-pms-door.test.ts5.3s5.3s6.2s150.4snot reviewed
107src/app/(workspace)/(operations)/agents/__tests__/page.decision-poll-keeps-answer.test.tsx5.1s5.1s5.5s60.9snot reviewed
108src/__tests__/renewal-payload-canary.test.ts5.1s5.1s5.9s110.5snot reviewed
109src/lib/integrations/appfolio/__tests__/occupancies-portfolio.test.ts4.9s5.0s5.9s80.6snot reviewed
110src/__tests__/clara-bundle-dynamic-export.drift.test.ts4.9s4.6s5.7s41.2snot reviewed
111agents/clara/lib/agent/tools/renewal/__tests__/handlers-skipped-send.test.ts4.9s5.0s5.5s190.3snot reviewed
112src/__tests__/renewal-auto-start.test.ts4.9s4.9s5.7s1770.0snot reviewed
113src/app/(workspace)/(operations)/review/page.star-selection.test.tsx4.8s4.7s5.4s150.3snot reviewed
114src/__tests__/specialist-tool-drift.test.ts4.8s2.3s48.1s90.5snot reviewed
115src/__tests__/temporal-failure-modes.test.ts4.8s4.8s5.5s590.1snot reviewed
116src/__tests__/staff-booking-tentative-calendar.test.ts4.8s4.7s5.8s60.8snot reviewed
117scripts/__tests__/sync-specialist-turn-agent-id.test.ts4.8s4.8s6.9s310.2snot reviewed
118src/lib/platform/__tests__/session-cache-signout.test.tsx4.6s4.1s5.7s310.1snot reviewed
119src/__tests__/agents-auth-gate.drift.test.ts4.6s4.3s5.7s140.3snot reviewed
120agents/clara/lib/agent/tools/renewal/__tests__/change-renewal-term.test.ts4.5s4.6s5.5s100.5snot reviewed
121lambda/inbound-processor/__tests__/inbox-email-company-mailbox-reply.test.ts4.5s4.5s5.4s130.3snot reviewed
122src/__tests__/smoke-live-api.test.ts4.5s4.4s5.5s90.5snot reviewed
123src/__tests__/tour-workflow-replay-corpus.test.ts4.5s4.1s5.4s50.9snot reviewed
124src/__tests__/deploy-digest.test.ts4.5s4.1s5.3s150.3snot reviewed
125src/__tests__/timeline-rail-inheritance.test.tsx4.4s4.4s5.4s600.1snot reviewed
126src/lib/integrations/email/__tests__/send-email-outcome.test.ts4.4s3.9s5.5s460.1snot reviewed
127agents/clara/lib/agent/tools/renewal/__tests__/decline-migrated-saga.test.ts4.4s4.3s5.2s100.4snot reviewed
128src/__tests__/contact-import.test.ts4.4s3.9s5.4s340.1snot reviewed
129src/__tests__/no-emoji-ui-chrome.drift.test.ts4.3s3.8s5.3s50.9snot reviewed
130src/__tests__/turnover-walk-replay.test.ts4.3s4.3s5.2s990.0snot reviewed
131src/__tests__/protected-classes-single-list.drift.test.ts4.3s4.0s5.0s530.1snot reviewed
132src/__tests__/tour-cancel-outcome-at-the-socket.test.ts4.3s4.2s5.1s130.3snot reviewed
133src/__tests__/middleware.test.ts4.3s4.3s4.8s2680.0snot reviewed
134src/__tests__/live-equals-main.drift.test.ts4.3s3.2s17.6s400.1sMove to nightlyFetches live ElevenLabs agent configs. It fails whenever a merged TURN change isn't synced to the fleet within 24h, e.g. the Escalation Callback agent. Fix: Run it as a nightly check that alerts and re-runs sync-specialists, not as a merge gate.
135src/__tests__/user-route-inventory.drift.test.ts4.3s3.8s5.2s170.3sAuto-update pinThe hand-kept route pin goes stale when routes are added; the mutation control also edits the real collections route by string-match and needs it pinned 'selection'. Fix: Generate the pin from a script, and run the mutation control on a fixture route instead of a real one.
136src/__tests__/auth-server-hooks.test.ts4.2s3.8s5.5s210.2snot reviewed
137src/__tests__/work-order-conversation-error.test.tsx4.2s3.9s5.2s31.4snot reviewed
138src/app/(workspace)/(operations)/leasing/renewals/board/_components/__tests__/BoardV2.test.tsx4.2s3.9s5.3s960.0snot reviewed
139src/lib/domain/escalation/__tests__/bake-gate.test.ts4.2s3.8s5.3s1080.0snot reviewed
140src/__tests__/org-scope-callers-read-the-authoritative-row.test.ts4.2s3.9s5.2s70.6snot reviewed
141src/lib/domain/agentflow/__tests__/read-only.test.ts4.2s3.9s5.2s280.1snot reviewed
142src/__tests__/turnover-r3-e2e.test.ts4.2s4.2s5.1s410.1snot reviewed
143src/__tests__/ask-clara-boot-wiring.test.tsx4.2s3.8s5.2s50.8snot reviewed
144src/__tests__/work-order-pipeline-dispatch.test.ts4.1s4.1s5.2s430.1snot reviewed
145src/lib/integrations/appfolio/__tests__/renewals-portfolio.test.ts4.1s4.2s4.6s70.6snot reviewed
146src/__tests__/forward-to-pm.test.ts4.0s4.0s4.9s350.1snot reviewed
147src/__tests__/scraper.test.ts4.0s4.0s4.0s150.3snot reviewed
148src/__tests__/turnover-wo-turnoverid-stamp.test.ts4.0s4.0s4.6s60.7snot reviewed
149lambda/inbound-processor/__tests__/inbox-email-inquiry-outbound-hold.test.ts4.0s4.0s4.7s80.5snot reviewed
150src/__tests__/renewal-workflow-signal-routes.test.ts4.0s3.9s4.6s190.2snot reviewed
151src/__tests__/work-order-pipeline-persist.test.ts4.0s3.9s4.4s230.2snot reviewed
152src/__tests__/prospect-conversation-error.test.tsx4.0s3.7s4.9s31.3snot reviewed
153agents/clara/lib/agent/__tests__/autonomous-handoff.test.ts3.9s3.9s5.1s530.1snot reviewed
154src/__tests__/packages-ui-build.drift.test.ts3.9s3.4s4.9s41.0snot reviewed
155lambda/inbound-processor/__tests__/inbox-email-review-hold.test.ts3.9s4.0s4.6s80.5snot reviewed
156src/__tests__/initiate-renewal-call.test.ts3.9s4.0s4.7s120.3snot reviewed
157src/__tests__/voice-initiation-ledger.test.ts3.9s3.9s4.3s190.2snot reviewed
158src/__tests__/set-my-quiet-hours.test.ts3.9s3.8s4.5s280.1snot reviewed
159src/__tests__/appfolio-renewal-summary-adapter.test.ts3.9s3.9s5.1s320.1snot reviewed
160src/lib/domain/leasing/reporting-digest/__tests__/run-digest.test.ts3.9s3.9s4.7s380.1snot reviewed
161src/__tests__/advisory-tests-off-pr-lane.drift.test.ts3.9s3.7s4.4s70.6snot reviewed
162src/lib/domain/scope/__tests__/mint-selection-cookie-never-widens.test.ts3.8s3.7s4.8s100.4snot reviewed
163src/__tests__/work-order-pipeline-gather.test.ts3.8s3.8s4.5s410.1snot reviewed
164src/__tests__/renewal-workflow-replay-corpus.test.ts3.8s3.5s4.5s41.0snot reviewed
165src/__tests__/tour-move-outcome-at-the-socket.test.ts3.8s3.8s4.4s80.5snot reviewed
166src/__tests__/audit-ai-core.test.ts3.8s3.4s4.9s310.1snot reviewed
167src/__tests__/scoped-list-cache-read-isolation.test.tsx3.8s3.4s4.8s690.1snot reviewed
168src/__tests__/run-outbound-takeover-release.test.ts3.7s3.8s4.6s310.1snot reviewed
169src/__tests__/sync-tour-write-retry.test.ts3.7s3.8s4.6s60.6snot reviewed
170src/__tests__/guard-pin-kinds.drift.test.ts3.7s3.6s4.3s100.4snot reviewed
171src/__tests__/schedule-tour-company-tour-length.test.ts3.7s3.5s4.5s21.8snot reviewed
172src/__tests__/smoke-results-api.test.ts3.7s3.3s4.7s80.5snot reviewed
173src/__tests__/turnover-tool-dispatcher.test.ts3.7s3.6s4.3s800.0snot reviewed
174src/__tests__/prospect-outreach-workflow-replay-corpus.test.ts3.7s4.0s4.4s40.9snot reviewed
175src/__tests__/api-routes.test.ts3.7s3.7s4.2s790.0snot reviewed
176src/__tests__/work-order-pipeline-orchestrator.test.ts3.6s3.7s4.3s100.4snot reviewed
177src/__tests__/appfolio-unit-vacancy-adapter.test.ts3.6s3.6s4.2s250.1snot reviewed
178src/__tests__/turnover-mangled-walk-corpus.test.ts3.6s3.5s4.1s2450.0snot reviewed
179src/__tests__/json-conditional-twin.drift.test.ts3.6s3.3s4.3s50.7snot reviewed
180agents/clara/lib/agent/tools/renewal/__tests__/change-renewal-term.contract.test.ts3.6s3.5s4.1s40.9snot reviewed
181src/__tests__/terminology-capability-senses.drift.test.ts3.6s3.6s3.9s70.5snot reviewed
182src/app/(workspace)/(operations)/agents/__tests__/session-page.overview-seed.test.ts3.5s3.5s3.6s130.3snot reviewed
183lambda/inbound-processor/__tests__/inbox-email-ingestion-record.test.ts3.5s3.4s4.2s60.6snot reviewed
184src/__tests__/classify-zero-selection.test.ts3.5s3.6s3.8s610.1snot reviewed
185src/__tests__/lint-step-names-its-failure.drift.test.ts3.5s2.7s26.8s260.1snot reviewed
186src/__tests__/handyman-create-wo.test.ts3.4s3.4s4.0s140.2snot reviewed
187src/__tests__/turnover-api.test.ts3.4s3.5s4.1s770.0snot reviewed
188src/__tests__/conversation-view-whole-history.test.tsx3.4s3.4s3.9s160.2snot reviewed
189src/__tests__/demo-appfolio-sync.test.ts3.4s3.3s3.5s110.3snot reviewed
190src/__tests__/conversation-container-resolver.drift.test.ts3.4s3.1s3.9s160.2snot reviewed
191src/__tests__/tool-handlers.test.ts3.3s3.4s3.7s1650.0snot reviewed
192src/__tests__/conversation-org-stamp-birth-discriminator.test.ts3.3s3.3s3.9s140.2snot reviewed
193src/lib/domain/agentflow/__tests__/pane-stream-contract.test.ts3.3s3.3s4.0s50.7snot reviewed
194src/lib/domain/dashboard/stats/__tests__/leasing-fold-largest-first.test.ts3.3s3.1s4.0s21.7snot reviewed
195scripts/__tests__/lambda-deploy-gate.test.ts3.3s3.0s3.9s1240.0snot reviewed
196src/lib/domain/maintenance/__tests__/tech-sms-dispatch-flow.test.ts3.3s3.3s3.9s230.1snot reviewed
197src/__tests__/send-renewal-letter-mms.test.ts3.3s3.3s4.0s110.3snot reviewed
198src/lib/domain/leasing/__tests__/email-lead-engine-stress.replay.test.ts3.2s3.3s3.9s180.2snot reviewed
199agents/clara/lib/agent/tools/renewal/__tests__/handlers-spine-name.test.ts3.2s3.2s3.8s40.8snot reviewed
200src/__tests__/vendor-completion.test.ts3.2s3.2s3.6s550.1snot reviewed

The single slowest tests

The slowest individual tests are mostly waiting, not working. The top one is the whole of appfolio-client.test.ts's 68 seconds: it waits through real retry delays instead of a fake clock.

#TestAverage
1AppfolioClient > surfaces failure when the server keeps returning 5xx (via appfolioPolicy) 67.6s
2the roster gate is reached from a known set of places > P2 · every declared entry point is called from exactly its declared files 22.5s
3deriveDeclaredCells — every way a caller reaches a hop > a hop graph too wide to converge FAILS CLOSED (MAX_HOPS) 16.8s
4the CLI survives the environment a git hook hands it > a poisoned GIT_DIR is scrubbed before a fixture-repo control runs, and that control passes 16.5s
5scoreConversationTurns — voice is graded PER UTTERANCE from the transcript rows, never as one call > through the REAL policy gate (only the vendor edge faked): the prefilter decides which utterances reach the judge, and 16.4s
6the CLI cannot be answered with a pass for controls it did not run > exits non-zero when --controls names an id the registry does not have 15.8s
7the addressed-write gate's operator premise > no production file under `src/` writes a `managed_by` row or calls the writer 15.5s
8household harness — rule 5: name text is never an input > rewriting every announced visitor name to garbage changes no household outcome 11.7s
9the conversation partition walk stays a closed set (board row p6-fanouts) > walks every building partition for CONV# rows in exactly the pinned places (leg 1) 11.3s
10every workflow that calls this script passes flags it honours > the one-call-one-email lane still names a control that exists 10.9s
11the text fence — no file reaches the carrier without declaring a module > the importers of the carrier are exactly the sanctioned set 10.3s
12resolve-table retrofit — an IMPORTED script must not resolve at module scope > no script that another file imports resolves its table at module scope 9.8s
13turn-checks route fence — no Next.js entry reaches the Cerebrus bridge > no file under src/app (route, page, layout, loading, error, …), middleware or instrumentation reaches grading/cerebrus, turn-checks, or quality-gat9.7s
14household harness — rule 5: name text is never an input > rewriting every display name to garbage changes no household outcome 9.6s
15the stub calendar provider is fenced off from production > detects the real importer — the POSITIVE CONTROL for the finder itself 9.3s

vitest only prints a single test's time when it is slow, so this table is the slow tail, not every test.

3 · What to do about each, and the numbers to beat — the eight suggestions, and today's baseline

Every file in the 52 reviewed (the 40 slowest plus every repeat failer) had its code read and was given one suggestion. Files further down the list say not reviewed. Seconds are each label's share of the average running time.

SuggestionWhat it meansFilesSeconds
Fake the clockIt sits through real retry delays or sleeps. A fake clock makes it take milliseconds.12233.5s
Share the scanIt re-reads or re-parses the codebase itself. Build that once per run and share it.12259.7s
Slim it downReal work, but repetitive: near-duplicate cases or heavy setup repeated per test.13211.7s
Move to nightlyCalls a live outside service or starts other programs. Run nightly with an alert, not on every merge.8114.8s
Auto-update pinCompares the code to a hand-kept list that goes stale whenever someone adds something.513.0s
Fix forward fasterThe test is fine; it caught a real break once. The fix is reverting the breaking PR sooner.67
KeepThe cost is justified and there is no cheap fix.229.3s
Delete?Duplicates another test or checks nothing meaningful. Read it before deleting.

Baseline: the numbers to beat (Oct 1, 2026)

Re-run the same measurement after the fixes land and compare against these.

MeasureTodayBasis
Full suite, start to finish (both halves)20.3 minmedian of 25 runs
One half of the suite, whole job (setup + install + tests)16.7 minmedian of 50 jobs; slowest 21.1 min
Inside one half: vitest wall clock14.6 minmedian of 16 halves
Inside one half: loading test files (summed over workers)62.3 minthe biggest single cost
Inside one half: running tests (summed over workers)24.0 minwhat the rankings on this page measure
All test files, running time added up53 minboth halves, 7,585 files

Re-measure after rows 82 and 40 (Oct 3, 15:47 UTC, main 60791eee54e)

Same machine type (m8g.2xlarge)Half 1, Oct 1 baselineHalf 1, Oct 3ChangeHalf 2, Oct 1 baselineHalf 2, Oct 3Change
CI job, start to finish15.1 min9.8 min−35%15.4 min9.5 min−39%
vitest wall clock866 s535 s−38%886 s516 s−42%
Loading test files (summed over workers)3,646 s1,897 s−48%3,869 s1,889 s−51%
Running tests (summed over workers)1,496 s952 s−36%1,357 s816 s−40%
Test files in the halfabout 3,7703,994about +6%about 3,7703,994about +6%

Each baseline figure is the median of the Oct 1 runs on this machine type (4 runs for half 1, 5 for half 2). Across their whole range the change is −34% to −37% (half 1 job), −37% to −41% (half 2 job), −47% to −54% (loading) and −35% to −42% (running).

What row 82 actually saved (vitest's own per-module import self time, both halves, the throwaway reporter: Oct 2 run 37027978394 on m7g.2xlarge, Oct 3 run 37133264469 on m8g.2xlarge). The two machines differ, so Oct 3 is also shown at m7g speed. Across 14 heavily loaded modules nobody changed in between, m8g took 0.73 times as long per load (middle half 0.68 to 0.77).

ModuleOct 2 (m7g)Oct 3 (m8g)Oct 3 at m7g speedWhy
src/lib/utils/explicit-year-day.ts646 s over 3,011 loadsunder 1.4 sabout 0row 82 part 1: plain arithmetic, no date-fns (now below the reporter's top-250 cut)
src/lib/domain/leasing/renewal-rent.ts320 s over 3,00288 s over 3,121120 srow 82 part 2: lightFormat instead of format
src/lib/domain/leasing/lease-terms/dates.ts36 s over 485112 s over 513153 scost moved here: it imports date-fns/format and now loads it first
src/lib/domain/vendors/vendor-calendar.ts5 s over 27733 s over 29644 scost moved here: it imports date-fns/parse
All four1,006 s233 s317 sabout −690 s per full run at m7g speed (−660 to −700), about −500 s on m8g; the estimate was about 600 s

All first-party module self time: 4,159 s on Oct 2 (m7g), 2,688 s on Oct 3 (m8g), which is about 3,670 s at m7g speed (−12%).

What is left, biggest first. src/lib/platform/auth/server.ts 519 s over 1,208 test-file loads on m8g (about 710 s at m7g speed; it was 660 s over 1,011 on Oct 2, because more files reach it every day). Trimming it is an auth change, so it needs its owner. src/lib/domain/leasing/lease-terms/dates.ts 112 s, now the first loader of date-fns/format; the same lightFormat change would likely remove most of it, unless the cost moves again. src/lib/domain/vendors/vendor-calendar.ts 33 s, the first loader of date-fns/parse.

Basis and limits. Timing: run 37133262569 (ci.yml dispatched on main at 60791eee54e), both halves on m8g.2xlarge, 3,994 + 3,994 test files, all passing (3 + 6 skipped). Baseline: this page's Oct 1 runs on m8g.2xlarge (half 1: 36829783241, 36882040216, 36875447902, 36870896634; half 2: the same four plus 36872698236). The Oct 1 file count is that day's 3,769 per half. One timing run, so the yardstick for noise is the baseline's own spread (886 to 926 s for half 1's job). Breakdown: run 37133264469, the same tree plus the throwaway reporter on a branch deleted afterwards. One test, self-review-unresolvable-range, failed only in that run; the plain run had none. Row 40 (the watchdog test leaving the per-PR lane, about 43 s of one worker) is too small to see in a half's wall clock, and rows 83 and 84 only add mocks.

Final re-measure (Oct 2, 16:01 UTC, main 16206803b2a)

Half 1 of the suite, same machine type (m7g.2xlarge)Oct 1 baselineOct 2 final (two runs)Change
CI job, start to finish20.4 min12.7–13.3 min−35% to −38%
vitest wall clock1,181 s723–756 s−36% to −39%
Loading test files (summed over workers)5,170 s2,694–2,825 s−45% to −48%
Running tests (summed over workers)1,847 s1,184–1,233 s−33% to −36%
Every vitest phase, summed over workers7,647 s4,521–4,729 s−38% to −41%
Test files in the half3,7693,888+3.2%

Against the Oct 1 medians above (mixed machines, mostly the faster Graviton4), today's runs on the slower Graviton3 still come in under every one: one half's whole job 16.7 → 12.5–13.3 min, vitest wall clock 14.6 → 11.8–12.6 min, loading 62.3 → 44–47 worker-minutes, running 24.0 → 18–21 worker-minutes. Half 2 today: 12.5–12.7 min job, 709–719 s vitest; its Oct 1 runs were all on Graviton4 (842–933 s), so there is no same-type pair for it.

Where the loading went (vitest's own per-module import self time, both halves, two runs with the throwaway reporter, both on m7g.2xlarge: Oct 2 01:40 UTC run 36949936682 against the final tree, run 37027978394):

ModuleBeforeFinalFixed by
src/lib/data/statuses/renewals.ts4,073 s44 srow 78: date-fns per function
packages/ui/src/FilterBar.tsx1,326 s15 srow 79: Phosphor per icon
src/lib/utils/format.ts816 s113 srow 78
Twilio client and webhook validator116 s14 srow 80: SDKs load on first use
src/lib/integrations/email/client.ts55 s27 srow 80
src/lib/temporal/pm-action-reminder-client.ts53 s0 (no longer loaded)row 80
All first-party modules9,498 s4,159 s−56%

What is left, biggest first. src/lib/platform/auth/server.ts 660 s over 1,011 test-file loads (it was 305 s over 475: new auth code today doubled the files that reach it); trimming it is an auth change, so it needs its owner. src/lib/utils/explicit-year-day.ts 646 s and src/lib/domain/leasing/renewal-rent.ts 320 s: the date-fns barrel is gone, but date-fns/parse (about 190 ms cold) and date-fns/format (about 113 ms, it brings the locale) still reach about 3,000 test files through them (row 82).

Basis and limits. Final: run 37027723475 (ci.yml dispatched on main at 16206803b2a) and run 37028316163 (an empty commit on the same tree, row 79’s change run), every half on m7g.2xlarge, 3,885 + 3,882 test files all passing in both. A third run on the same tree with the throwaway reporter (37027978394) fell inside that range: 725 / 720 s. Baseline: run 36872698236 half 1, the only Oct 1 baseline half on m7g. The gain is the whole effort since the baseline (every merged row on the tracker), not only the loading rows. One Oct 1 half on this machine type is a small sample, and the same tree varied by up to 5% from run to run today, which is why the table gives ranges.

Where the loading time goes (Oct 2)

Interim re-measure (Oct 1, 23:33 UTC, main 4d1921089)

Measure (one half, summed over workers unless noted)Baseline, same machine typeInterimChange
Running tests, same 3,757 files (half 1, Graviton3 m7g)1,841 s1,584 s−14.0%
Running tests, same 3,748 files (half 2, Graviton4 r8gn)1,355 s1,170 s−13.6%
Loading test files (half 1, m7g)5,170 s5,385 s+4.2%
Loading test files (half 2, r8gn)3,804 s3,940 s+3.6%
vitest wall clock (half 1, m7g)19.7 min19.7 min+0.2%
vitest wall clock (half 2, r8gn)14.6 min14.5 min−0.1%

Basis and limits. Interim: run 36941383284 (dispatched on main; 6 + 3 test files failed from main's own reds, which does not change the timing). Each baseline row is the one baseline run on that machine type (36872698236 half 1 on m7g, 36865074180 half 2 on r8gn), so loading and wall clock within about ±8% are noise. The running-time drop is the same in both halves on two different machine types, and it is measured on the files present in both runs (the suite gained 121 test files and lost 65 since the baseline). Rows still open when this ran (20, 21, 24, 28–41, 44, 49, 75 and others) are not in it. The final re-measure comes after they land.

How this was measured
PropFlow Docs