6f2d5abe744c581bfa84f324ae161c92ca0a4dbb
lrnassar
  Wed Jul 8 12:12:27 2026 -0700
Sort ClinVar HGVS expression list so output order is stable regardless of NCBI's row order in hgvs4variation.txt.gz. This stops the doUpdate maxDiff sanity check from tripping when NCBI reshuffles rows (a cosmetic reorder that made ~96% of lines differ while the data was unchanged). No RM.

diff --git src/hg/utils/otto/clinvar/clinVarToBed src/hg/utils/otto/clinvar/clinVarToBed
index bf327004cff..db99316e368 100755
--- src/hg/utils/otto/clinvar/clinVarToBed
+++ src/hg/utils/otto/clinvar/clinVarToBed
@@ -820,31 +820,33 @@
       submCategories, varId, posVcf, refAllVcf, altAllVcf, somClinImpact, somClinLastEval, revStatusClinImpact, oncogen, oncogenLastEval, revStatusOncogen, aggrGermClass, aggrSomClassImpact, aggrSomOnc = row
    # SomaticClinicalImpact|SomaticClinicalImpactLastEvaluated|ReviewStatusClinicalImpact|Oncogenicity|OncogenicityLastEvaluated|ReviewStatusOncogenicity
 
     if chrom=="" or assembly=="" or assembly=="NCBI36" or assembly=="na":
         noAssCount += 1
         continue
 
     if assembly=="GRCh37":
         hgvs = hg19Hgvs
     elif assembly=="GRCh38":
         hgvs = hg38Hgvs
     else:
         print("Invalid assembly: %s, row %s" % (repr(assembly), repr(row)))
         assert(False)
 
-    hgvsTable =  json.dumps(hgvs[alleleId])
+    # sort the HGVS expressions so the output order does not depend on NCBI's
+    # row order in hgvs4variation.txt.gz, which they reshuffle from time to time
+    hgvsTable =  json.dumps(sorted(hgvs[alleleId]))
 
     molConseq = allToVcf.get(int(alleleId))
     isTrunc = False
     if molConseq is None:
         noMcCount += 1
         molConseq = ""
     else:
         if molConseq in truncConseqs:
             isTrunc = True
 
     if chromAcc=="NT_187513.1":
         chrom = "chrUn_KI270742v1"
     elif chromAcc=="NT_167222.1":
         chrom = "chrUn_gl000228"
     elif chromAcc=='NT_187499.1':