58fa228f2f91ae8c6a5c62109e904f57e1f9a66d
braney
  Wed Sep 30 11:03:02 2026 -0700
docent regression scripts for nineteen v504 tickets, and their registry rows

Each script watches one v504 fix. Fourteen fail on v503 (ts park 38316) and
pass on genome-test (release-ab). rm38313 and rm38393 are sandbox-ab, because
no release predates their fix. rm37984, rm38233 and rm38384 are
assertion-only; each header says why.

The registry now names the script in the docent column for these tickets, and
has new rows for #38157 and #38393. #38275 stays unwatched in the table: the
script that watches it is rm37389, which is named for another ticket.

refs #20824, #27988, #36292, #37595, #37621, #37929, #37984, #38157, #38192,
#38197, #38233, #38254, #38264, #38273, #38313, #38323, #38372, #38384,
#38393, #38252, #38391

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

diff --git src/hg/utils/docent/tests/regress/rm36292.docent.yaml src/hg/utils/docent/tests/regress/rm36292.docent.yaml
new file mode 100644
index 00000000000..5701263e586
--- /dev/null
+++ src/hg/utils/docent/tests/regress/rm36292.docent.yaml
@@ -0,0 +1,95 @@
+# #36292 -- "Keep only last search", an opt-in checkbox on the new BLAT search form.  Since
+# #32751 every BLAT search leaves a custom track behind, and users asked for a way to keep
+# only the newest one.  Unchecked (the default), results accumulate as before.  Checked, the
+# next search removes the reader's earlier BLAT result tracks.
+#
+# 994528edb7d: hg/hgBlat/hgBlat.c (showOnlyLatest and onlyLatest in hgBlatFormData),
+# hg/js/hgBlat.js (the checkbox, a hidden blatOnlyLatest field, the localStorage memory),
+# hg/hgc/hgc.c (buildBigPsl drops every earlier blatResult=on track when the box was ticked).
+#
+# HG.CONF GATE: `blatOnlyLatestCheckbox=on`, off by default.  With it off the checkbox is not
+# drawn and hgc never removes anything, so the script fails at the wait for the checkbox --
+# a configuration answer, not a regression.  Settle it with
+#     grep -n '^blatOnlyLatestCheckbox' /usr/local/apache/cgi-bin/hg.conf
+# genome-test has it on, and so does every ticket park, since they include that hg.conf.
+# The script also leans on blatResultsGroup=on (#38086), for the track labels it reads.
+# The checkbox is on the NEW form only, which blatNewForm=off keeps opt-in until the switch
+# date; the script opts in with blatNewForm=1 on the URL.
+#
+# What is asserted, in order:
+#   * two searches with the box unchecked leave two tracks.  That is the default the ticket
+#     says must not change, and it is also what makes the later checks mean something.
+#   * a third search sent with blatOnlyLatest=1 -- the hidden field the checkbox drives --
+#     leaves ONE track, the third.  This is the hgc half, the removal, on its own.
+#   * the new form draws the checkbox, labelled, and unticked once blatOnlyLatest is back
+#     to 0.  Ticking it sets the hidden field.
+#   * a fourth search from the form, box ticked, leaves one track again: the fourth.
+#
+# NOT asserted: that the choice is remembered across visits.  That is localStorage, and each
+# Docent run starts in a fresh browser context, so the next visit is always a first one.
+proof:
+  - "assertion-only 2026-09-30 -- written from #36292 after 994528edb7d reached genome-test"
+  - "release-ab 2026-09-30 -- passes on genome-test, hgwbeta (v504) and ts park 38423 (v504_branch); fails on ts park 38316 (v503_branch, same hg.conf with blatOnlyLatestCheckbox=on) at step 13: after the blatOnlyLatest=1 search, SMYD4 and TP53 are both still listed in the BLAT group. An earlier draft that went straight to the form failed there at the wait for #blat_onlyLatest: v503 draws the new form with no such checkbox"
+
+target: genome-test
+db: hg38
+reset: true
+fast: true
+steps:
+  # Two searches, box unchecked, by GET.  The results page builds each track itself, through
+  # an ajax call to hgc, hence the sleeps (as in rm38086).
+  - goto: "/cgi-bin/hgBlat?userSeq=ctgggcaacatagcaagaccccatctctacaaaaaatacaaaaattagccgggcgtggtggcgcgcgcctgtagtcccagctactcgggaggctgaggcagg&type=BLAT%27s+guess&db=hg38&org=Human&output=hyperlink&Submit=submit"
+  - expect:
+      text: "BLAT Search Results"
+  - sleep: 3000
+  - goto: "/cgi-bin/hgBlat?userSeq=MEEPQSDPSVEPPLSQETFSDLWKLLPENNVLSPLPSQAMDDLMLSPDDIEQWFTEDPGP&type=protein&db=hg38&org=Human&output=hyperlink&Submit=submit"
+  - expect:
+      text: "BLAT Search Results"
+  - sleep: 3000
+
+  # Unchecked keeps both.
+  - goto: "/cgi-bin/hgTracks?db=hg38&position=chr17:1809779-1810005&pix=1100"
+  - expect:
+      has:
+        - 'a.trackLink[data-group="blat"][mouseoverText^="BLAT 102bp SMYD4,"]'
+        - 'a.trackLink[data-group="blat"][mouseoverText^="BLAT 60aa TP53,"]'
+
+  # A third search with the box's hidden field set, as the form sends it when ticked.
+  - goto: "/cgi-bin/hgBlat?userSeq=GTCTCCTGCAGCGTCTGGGGTTTCCGTTGCAGTCCTCGGAACCAGGACCTCGGCGTGGCCTAGCGAGTTATGGCGACGAAGGCCGTGTGCGTGCTGAAGGGCGACGGCCCAGTGCAGGGC&type=BLAT%27s+guess&db=hg38&org=Human&output=hyperlink&blatOnlyLatest=1&Submit=submit"
+  - expect:
+      text: "BLAT Search Results"
+  - sleep: 3000
+  - goto: "/cgi-bin/hgTracks?db=hg38&position=chr21:31659700-31659820&pix=1100"
+  - expect:
+      has: 'a.trackLink[data-group="blat"][mouseoverText^="BLAT 120bp SOD1,"]'
+      noHas:
+        - 'a.trackLink[data-group="blat"][mouseoverText^="BLAT 102bp SMYD4,"]'
+        - 'a.trackLink[data-group="blat"][mouseoverText^="BLAT 60aa TP53,"]'
+
+  # The new form, and the checkbox on it, unticked with the cart variable back at 0.
+  - goto: "/cgi-bin/hgBlat?blatNewForm=1&blatOnlyLatest=0&db=hg38"
+  - wait: '#blat_onlyLatest'
+  - expect:
+      text: "Keep only last search"
+      has: ['#blat_onlyLatest:not(:checked)', 'input#blatOnlyLatestVal[value="0"]']
+
+  # Tick it and search a fourth time, from the form.
+  - click: '#blat_onlyLatest'
+  - expect:
+      has: ['#blat_onlyLatest:checked', 'input#blatOnlyLatestVal[value="1"]']
+  - fill: {'textarea[name="userSeq"]': "CCTCCCCCAGTCACGCTTTCCCACCCCCTGCAGTGGGGGCTCCAGAAGCGGGCAGGAAGCCACAGGACCCCATCTCGGGGCATGGAGAACCTTGGGCTCT"}
+  - click: '#blatFormBox input[type="submit"][name="Submit"]'
+  # A search from the new form lands on the new results page, which is titled differently.
+  - wait: '#blatResults'
+  - expect:
+      text: "Human (hg38) BLAT Results"
+  - sleep: 3000
+
+  # Only the fourth search is left.
+  - goto: "/cgi-bin/hgTracks?db=hg38&position=chr7:155806000-155806100&pix=1100"
+  - expect:
+      has: 'a.trackLink[data-group="blat"][mouseoverText^="BLAT 100bp SHH,"]'
+      noHas:
+        - 'a.trackLink[data-group="blat"][mouseoverText^="BLAT 120bp SOD1,"]'
+        - 'a.trackLink[data-group="blat"][mouseoverText^="BLAT 102bp SMYD4,"]'
+        - 'a.trackLink[data-group="blat"][mouseoverText^="BLAT 60aa TP53,"]'