23790efe33021ccd1691bf5f4262c1396a1f6e9d
braney
  Fri May 1 12:49:13 2026 -0700
quickLiftBench: phase_asserts mechanism + parallel-fetch regression case

phase_asserts is a per-case schema in cases.yaml that declares regex
matches against the per-iteration timing spans, with optional
required/min_median_ms/max_median_ms bounds. When a case declares
phase_asserts, the runner captures phase data automatically and runs
the asserts after iterations complete; any failure prints to stderr
and exits non-zero.

The new regress_quickLift_parallel case uses this to assert that the
"Waiting for parallel..." span fires for the lifted multi-track session
Brianraney/benchQuickPara with a median between 500 and 15000 ms --
discriminating the working sandbox build from a pre-fix hgwdev where
only non-quickLift tracks parallelize at ~50 ms.

refs #37488, #37470

diff --git src/utils/qa/quickLiftBench/cases.yaml src/utils/qa/quickLiftBench/cases.yaml
index b3dadb4f194..d0fb7ae939c 100644
--- src/utils/qa/quickLiftBench/cases.yaml
+++ src/utils/qa/quickLiftBench/cases.yaml
@@ -49,15 +49,40 @@
       native: Brianraney/benchQuickNative1
       lifted: Brianraney/benchQuickList1
     compare:
       - [native, lifted]
 
   # -------- Bench pair 1: same sessions on the public RR --------
   - id: bench1_rr
     description: |
       Same session pair as bench1_hgwdev, run against genome.ucsc.edu.
     server: rr
     variants:
       native: Brianraney/benchQuickNative1
       lifted: Brianraney/benchQuickList1
     compare:
       - [native, lifted]
+
+  # -------- Regression: parallel-fetch tripwire (refs #37488, #37470) --------
+  # phase_asserts make this case fail-fast if the parallel pool stops
+  # firing for quickLift tracks (e.g. a regression in isTrackForParallelLoad
+  # or customFactoryParallelLoad). Runs against the sandbox until the fix
+  # lands on hgwdev.
+  - id: regress_quickLift_parallel
+    description: |
+      Regression tripwire: a quickLifted multi-track session must
+      spawn the parallel-fetch worker pool. Asserts the
+      "Waiting for parallel..." span is emitted in every iteration.
+    server: sandbox
+    variants:
+      base: Brianraney/benchQuickPara
+    phase_asserts:
+      # Required + min_median together: catch a regression that drops the
+      # quickLift tracks back to serial. With the fix in place the median
+      # parallel wait is several seconds; without it (only non-quickLift
+      # tracks parallelize) the wait is ~50 ms, so 500 ms cleanly separates
+      # the working and broken cases.
+      - variant: base
+        phase: 'Waiting for parallel \(\d+ threads for \d+ tracks\) remote data fetch'
+        required: true
+        min_median_ms: 500
+        max_median_ms: 15000